面試官:類的加載方式

類的加載方式

1、隱式加載 -new
2、顯式加載 -ClassLoader.loadClassClass.forName
區(qū)別:
方式1:
new 通過關(guān)鍵字 然后通過不同的構(gòu)造器直接創(chuàng)建實(shí)例。
如:new String() ,new String("test")
方式2:
需要加載.class文件獲取Class對(duì)象,通過Class對(duì)象,獲取構(gòu)造器,然后調(diào)用newInstance方法創(chuàng)建對(duì)象實(shí)例。

public class Test2 {
    public static void main(String[] args) {
        try {
            //class.forName 加載方式
            Class<?> classForName = Class.forName("com.javalearning.TestClass");
            Constructor<?> constructor1 = classForName.getConstructor(String.class);
            constructor1.newInstance("加載方式Class.forName:有一個(gè)參數(shù)的構(gòu)造器");

            //loader加載方式
            ClassLoader classLoader = ClassLoader.getSystemClassLoader();
            Class<?> classLoaderClass = classLoader.loadClass("com.javalearning.TestClass");
            Constructor<?> constructor2 = classLoaderClass.getConstructor(String.class);
            constructor2.newInstance("加載方式ClassLoader:有一個(gè)參數(shù)的構(gòu)造器");
        }catch (Exception e){

        }
    }
}

ClassLoader.loadClass和Class.forName的區(qū)別

Class的裝載包括3個(gè)步驟:加載(loading),連接(link),初始化(initialize
參考:類的加載過程

Class.forName

Class.forName源碼

forName0 第二個(gè)參數(shù)initialize初始話 這里參數(shù)是true說(shuō)明是初始化過的,因此,靜態(tài)代碼快和靜態(tài)變量是會(huì)被執(zhí)行和初始話的。

ClassLoader.loadClass

ClassLoader.loadClass源碼

第二參resolve,注釋中說(shuō)明 這個(gè)參數(shù) 代表是否鏈接(類加載過程中的鏈接過程)
ClassLoader.loadClass在加載類的過程中只走了第一步。

測(cè)試:

image.png
image.png

image.png

總結(jié):

Class.forName得到的class是已經(jīng)初始化。
ClassLoader.loadeClass得到的class是還沒有鏈接的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。