1.類加載器
Java虛擬機中可以安裝多個類加載器,系統默認主要三個類加載器,每個類負責加載特定位置的類:BootStrap(內嵌在java虛擬機中由C++編寫),ExtClassLoader,AppClassLoader。當然也可以自定義類加載器,自定義的加載器必須繼承ClassLoader。
Java虛擬機中的所有類加載器采用具有父子關系的樹形結構進行組織,在實例化每個類加載器對象時,需要為其指定一個父級類加載器對象或者默認采用系統類加載器為其父級類加載。
2.下面我們來看如下一段代碼:
1
2
3
4
5
6
7
8
9
10
|
public
class
ClassLoaderTest {
public
static
void
main(String[] args) {
ClassLoader loader = ClassLoaderTest.
class
.getClassLoader();
while
(loader !=
null
) {
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
System.out.println(loader);
}
}
|
// 先后輸出為:
// sun.misc.Launcher$AppClassLoader
// sun.misc.Launcher$ExtClassLoader
// null : 注null就代表是BootStrap類加載器,該加載器是頂級加載器,沒有父類加載器
3.類加載器之間的父子關系和管轄范圍:
BootStrap -> ExtClassLoader -> AppClassLoader(即通常所說的System ClassLoader)
它們的管轄范圍依次是:
BootStrap------>JRE/lib/rt.jar
ExtClassLoader---------->JRE/lib/ext/*.jar
AppClassLoader---------->CLASSPATH指定的所有jar或目錄。
4.父類委托機制
父類委托機制除了頂層的啟動類加載器外,其余的類加載器都應當有自己的父類加載器。之前看的很多java教程里面都講到,這里類加載器之間的父子關系一般不會以繼承的關系來實現,而是都使用組合關系來復用父加載器的代碼。
父類委托機制工作過程是:如果一個類加載器收到了類加載的請求,他首先不會自己去嘗試加載這個類,而是把這個請求委托給父類加載器去完成,每一個層級的類加載都是如此,因此所有的加載請求最終都應該傳送到頂層的啟動類加載器中,只有當父加載器反饋自己無法完成這個加載請求時,子加載器才會嘗試自己去加載。
下面是類加載器層級展示: