3 回答

TA貢獻1818條經驗 獲得超11個贊
java應用環境中不同的class分別由不同的ClassLoader負責加載。
一個jvm中默認的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分別各司其職:
Bootstrap ClassLoader負責加載java基礎類,主要是 %JRE_HOME/lib/ 目錄下的rt.jar、resources.jar、charsets.jar和class等;
Extension ClassLoader負責加載java擴展類,主要是 %JRE_HOME/lib/ext 目錄下的jar和class;
App ClassLoader負責加載當前java應用的classpath中的所有類。
其中Bootstrap ClassLoader是JVM級別的,由C++撰寫;Extension ClassLoader、App ClassLoader都是java類,都繼承自URLClassLoader超類。
Bootstrap ClassLoader由JVM啟動,然后初始化sun.misc.Launcher ,sun.misc.Launcher初始化Extension ClassLoader、App ClassLoader。
Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader三者的關系如下:
Bootstrap ClassLoader是Extension ClassLoader的parent,Extension ClassLoader是App ClassLoader的parent。
但是這并不是繼承關系,只是語義上的定義,基本上,每一個ClassLoader實現,都有一個Parent ClassLoader。
可以通過ClassLoader的getParent方法得到當前ClassLoader的parent。Bootstrap ClassLoader比較特殊,因為它不是java class所以Extension ClassLoader的getParent方法返回的是NULL。
添加回答
舉報