Java提供了抽象類ClassLoader,所有用戶自定義類裝載器都實(shí)例化自ClassLoader的子類。 System Class Loader是一個(gè)特殊的用戶自定義類裝載器,由JVM的實(shí)現(xiàn)者提供,在編程者不特別指定裝載器的情況下默認(rèn)裝載用戶類。系統(tǒng)類裝載器可以通過(guò)ClassLoader.getSystemClassLoader() 方法得到。
例1,測(cè)試你所使用的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(); } }} 在我的機(jī)器上(Sun Java 1.5)的運(yùn)行結(jié)果
C:/java>java LoaderSample1 sun.misc.Launcher$AppClassLoader@82ba41 sun.misc.Launcher$ExtClassLoader@923e30 null java.lang.Object's loader is null LoaderSample1's loader is sun.misc.Launcher$AppClassLoader@82ba41
如圖1所示,loader2的parent為loader1,loader1的parent為system class loader。假設(shè)loader2被要求裝載類MyClass,在parent delegation模型下,loader2首先請(qǐng)求loader1代為裝載,loader1再請(qǐng)求系統(tǒng)類裝載器去裝載MyClass。若系統(tǒng)裝載器能成功裝載,則將MyClass所對(duì)應(yīng)的Class對(duì)象的reference返回給loader1,loader1再將reference返回給loader2,從而成功將類MyClass裝載進(jìn)虛擬機(jī)。若系統(tǒng)類裝載器不能裝載MyClass,loader1會(huì)嘗試裝載MyClass,若loader1也不能成功裝載,loader2會(huì)嘗試裝載。若所有的parent及l(fā)oader2本身都不能裝載,則裝載失敗。