了解雙親委派,需要先了解下JAVA的類加載器ClassLoader,java的類加載器主要有以下幾種
什么是類加載器?
類加載器是jre的一部分,負責動態將類添加到Java虛擬機。
類加載分類
1、啟動類加載器 bootstrap classloader :加載jre/lib/rt.jar
2、擴展類加載器 extension classloader :加載jre/lib/ext/*.jar
3、應用程序類加載器 application classloader:加載classpath上指定的類庫
雙親委派機制
雙親委派機制是指當一個類加載器收到一個類加載請求時,該類加載器首先會把請求委派給父類加載器。每個類加載器都是如此,只有在父類加載器在自己的搜索范圍內找不到指定類時,子類加載器才會嘗試自己去加載。
雙親委派模型工作工程:
1.當Application ClassLoader 收到一個類加載請求時,他首先不會自己去嘗試加載這個類,而是將這個請求委派給父類加載器Extension ClassLoader去完成。
2.當Extension ClassLoader收到一個類加載請求時,他首先也不會自己去嘗試加載這個類,而是將請求委派給父類加載器Bootstrap ClassLoader去完成。
3.如果Bootstrap ClassLoader加載失敗(在<JAVA_HOME>\lib中未找到所需類),就會讓Extension ClassLoader嘗試加載。
4.如果Extension ClassLoader也加載失敗,就會使用Application ClassLoader加載。
5.如果Application ClassLoader也加載失敗,就會使用自定義加載器去嘗試加載。
6.如果均加載失敗,就會拋出ClassNotFoundException異常。
例子:
當一個Hello.class這樣的文件要被加載時。不考慮我們自定義類加載器,首先會在AppClassLoader中檢查是否加載過,如果有那就無需再加載了。如果沒有,那么會拿到父加載器,然后調用父加載器的loadClass方法。父類中同理會先檢查自己是否已經加載過,如果沒有再往上。注意這個過程,直到到達Bootstrap classLoader之前,都是沒有哪個加載器自己選擇加載的。如果父加載器無法加載,會下沉到子加載器去加載,一直到最底層,如果沒有任何加載器能加載,就會拋出ClassNotFoundException。