顧名思義,類裝載器是用來把類 (class) 裝載進 JVM 的。 JVM 規(guī)范定義了兩種類型的類裝載器:啟動內(nèi)裝載器 (bootstrap) 和用戶自定義裝載器 (user-defined class loader) 。
JVM
的類動態(tài)裝載技術(shù)能夠在運行時刻動態(tài)地加載或者替換系統(tǒng)的某些功能模塊
,
而不影響系統(tǒng)其他功能模塊的正常運行。
裝載就是尋找一個類或是一個接口的二進制形式并用該二進制形式來構(gòu)造代表這個類或是這個接口的
class
對象的過程,其中類或接口的名稱是給定了的。當(dāng)然名稱也可以通過計算得到,但是更常見的是通過搜索源代碼經(jīng)過編譯器編譯后所得到的二進制形式來構(gòu)造。
在
Java
中,類裝載器把一個類裝入
Java
虛擬機中,要經(jīng)過
三個步驟
來完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:
裝載:查找和導(dǎo)入類或接口的二進制數(shù)據(jù);
鏈接:執(zhí)行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;
校驗:檢查導(dǎo)入類或接口的二進制數(shù)據(jù)的正確性;
準備:給類的靜態(tài)變量分配并初始化存儲空間;
解析:將符號引用轉(zhuǎn)成直接引用;
初始化:激活類的靜態(tài)變量的初始化
Java
代碼和靜態(tài)
Java
代碼塊。
bootstrap 是 JVM 自帶的類裝載器,用來裝載核心類庫,如 java.lang.* 等。由例 1 可以看出, java.lang.Object 是由 bootstrap 裝載的。
Java 提供了抽象類 ClassLoader ,所有用戶自定義類裝載器都實例化自 ClassLoader 的子類。
System Class Loader 是一個特殊的用戶自定義類裝載器,由 JVM 的實現(xiàn)者提供,在編程者不特別指定裝載器的情況下默認裝載用戶類。系統(tǒng)類裝載器可以通過 ClassLoader.getSystemClassLoader() 方法得到。
例 1 ,測試你所使用的 JVM 的 ClassLoader
/*LoaderSample1.java*/
public class LoaderSample1
{
?????? public static void main(String[] args)
?????? {
????????????? Class c;
????????????? ClassLoader cl;
?????????????
????????????? cl = ClassLoader.getSystemClassLoader();
????????????? System.out.println(cl);
?????????????
????????????? while (cl != null)
????????????? {
???????????????????? cl = cl.getParent();
???????????????????? System.out.println(cl);?????????
????????????? }
????????????? try
?????? ?????? {
????????????????????
c = Class.forName(“java.lang.Object”);
???????????????????? cl = c.getClassLoader();
???????????????????? System.out.println(“java.lang.Object’s loader is ” + cl);
???????????????????? c = Class.forName(“LoaderSample1”);
cl = c.getClassLoader();
???????????????????? System.out.println(“LoaderSample1’s loader is ” + cl);
?????????????
}
????????????? catch (Exception e)
????????????? {
???????????????????? e.printStackTrace();
}
?????? }
}
在我的機器上 (Sun Java 1.4.2) 的 運行結(jié)果
sun.misc.Launcher$AppClassLoader@1a0c10f
sun.misc.Launcher$ExtClassLoader@e2eec8
null
java.lang.Object's loader is null
LoaderSample1's loader is sun.misc.Launcher$AppClassLoader@1a0c10f
第一行表示,系統(tǒng)類裝載器實例化自類 sun.misc.Launcher$AppClassLoader
第二行表示,系統(tǒng)類裝載器的 parent 實例化自類 sun.misc.Launcher$ExtClassLoader
第三行表示,系統(tǒng)類裝載器 parent 的 parent 為 bootstrap
第四行表示,核心類 java.lang.Object 是由 bootstrap 裝載的
第五行表示,用戶類 LoaderSample1 是由系統(tǒng)類裝載器裝載的