類的加載方式
1、隱式加載 -new
2、顯式加載 -ClassLoader.loadClass和Class.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是還沒有鏈接的。