類的加載方式
1抢肛、隱式加載 -new
2、顯式加載 -ClassLoader.loadClass
和Class.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
forName0
第二個(gè)參數(shù)initialize
初始話 這里參數(shù)是true
說明是初始化過的晾咪,因此,靜態(tài)代碼快和靜態(tài)變量是會(huì)被執(zhí)行和初始話的贮配。
ClassLoader.loadClass
第二參
resolve
谍倦,注釋中說明 這個(gè)參數(shù) 代表是否鏈接(類加載過程中的鏈接過程)ClassLoader.loadClass
在加載類的過程中只走了第一步。
測(cè)試:
總結(jié):
Class.forName
得到的class
是已經(jīng)初始化泪勒。
ClassLoader.loadeClass
得到的class
是還沒有鏈接的昼蛀。