面試官:類的加載方式

類的加載方式

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

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:有一個參數(shù)的構造器");

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

        }
    }
}

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

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

Class.forName

Class.forName源碼

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

ClassLoader.loadClass

ClassLoader.loadClass源碼

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

測試:

image.png
image.png

image.png

總結:

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容