顧名思義,類裝載器是用來把類
(class)
裝載進
JVM
的。
JVM
規范定義了兩種類型的類裝載器:啟動內裝載器
(bootstrap)
和用戶自定義裝載器
(user-defined class loader)
。
?
JVM
的類動態裝載技術能夠在運行時刻動態地加載或者替換系統的某些功能模塊
,
而不影響系統其他功能模塊的正常運行。
?
裝載就是尋找一個類或是一個接口的二進制形式并用該二進制形式來構造代表這個類或是這個接口的
class
對象的過程,其中類或接口的名稱是給定了的。當然名稱也可以通過計算得到,但是更常見的是通過搜索源代碼經過編譯器編譯后所得到的二進制形式來構造。
在
Java
中,類裝載器把一個類裝入
Java
虛擬機中,要經過
三個步驟
來完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:
裝載:查找和導入類或接口的二進制數據;
鏈接:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;
校驗:檢查導入類或接口的二進制數據的正確性;
準備:給類的靜態變量分配并初始化存儲空間;
解析:將符號引用轉成直接引用;
初始化:激活類的靜態變量的初始化
Java
代碼和靜態
Java
代碼塊。
?
bootstrap
是
JVM
自帶的類裝載器,用來裝載核心類庫,如
java.lang.*
等。由例
1
可以看出,
java.lang.Object
是由
bootstrap
裝載的。
?
Java
提供了抽象類
ClassLoader
,所有用戶自定義類裝載器都實例化自
ClassLoader
的子類。
System Class Loader
是一個特殊的用戶自定義類裝載器,由
JVM
的實現者提供,在編程者不特別指定裝載器的情況下默認裝載用戶類。系統類裝載器可以通過
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)
的
運行結果
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
?
第一行表示,系統類裝載器實例化自類
sun.misc.Launcher$AppClassLoader
第二行表示,系統類裝載器的
parent
實例化自類
sun.misc.Launcher$ExtClassLoader
第三行表示,系統類裝載器
parent
的
parent
為
bootstrap
第四行表示,核心類
java.lang.Object
是由
bootstrap
裝載的
第五行表示,用戶類
LoaderSample1
是由系統類裝載器裝載的