一段代碼挺有意思:
public class Quux {
public static void main(String[] args) {
ClassLoader cl=Quux.class.getClassLoader();
System.out.println("Delegation for Quux:");
while(cl!=null){
System.out.println(cl);
cl=cl.getParent();
}
System.out.println("{bootstrap loader}");
}
}
得到得結果是:
Delegation for Quux:
sun.misc.Launcher$AppClassLoader@131f71a
sun.misc.Launcher$ExtClassLoader@15601ea
{bootstrap loader}
這鍛代碼展現(xiàn)了類加載的3個加載器(ClassLoader):
AppClassLoader是系統(tǒng)類加載器,(即由getSystemClassLoader()方法可得到的Loader),它主要負責加載應用類。
ExtClassLoader是擴展類加載器,默認下負責加載${JAVA_HOME}$/lib/ext目錄下的類。
bootstrapLoader是引導類加載器,主要負責檢查引導路徑及加載核心api包。
這3個加載器先后為 boot->Ext->App ,boot是Ext的父加載器,Ext是App的父加載器,加載器是成樹狀的,當然也可以自己定義加載器。加載器加載的每一個類的實例都維護個指向裝載器的引用,所以要得到加載器得引用很簡單:getClassLoader()就行了,而getParent()則得到其父類加載器(代碼中表現(xiàn)的很清楚了)。
類加載器有個委托規(guī)則(基本上就是偷懶規(guī)則):加載器加載類前總是要問下父加載器有沒有這個類(有就不加載了-_-!),而這個過程中的ClassLoader遞歸集就稱為一個DELEGATION.
加載的過程又有顯示加載,一般用URLClassLoader:
new URLClassLoader(new URL[]{url})
這玩意玩熱部署挺有意思的,tom貓里好像就有(沒什么印象,汗)。
有的人也用Loader來裝載配置文件,我也喜歡這么用,
getSystemClassLoader().getResourceAsStream(String res);
這個方法返回個InputStream,用properties提取下就行了,真是居家旅行必備良藥啊。
new Properties().load(is);
還有隱式加載,既然叫隱式,咱明代碼就干涉不到了,繼承,引用一般都是隱式加載類的。
對了,java中還有個參數(shù):-verbose,用了它就可以詳細看到加載的過程。
類加載屬于中級的知識了,應用內(nèi)容也不是一點兩點,咱又不是牛人,講不太清楚。牛人Halloway寫的component Development for the java Platform挺不錯,建議看看;在IMBDevelopers上還有幾篇很好的文章,有興趣的話就去看看吧。