Java雙親委派機(jī)制

什么是雙親委派機(jī)制

當(dāng)某個(gè)類加載器需要加載某個(gè).class文件時(shí),它首先把這個(gè)任務(wù)委托給他的上級(jí)類加載器,遞歸這個(gè)操作,如果上級(jí)的類加載器沒有加載,自己才會(huì)去加載這個(gè)類。

類加載器的類別

BootstrapClassLoader(啟動(dòng)類加載器)

c++編寫,加載java核心庫(kù)java.*,構(gòu)造ExtClassLoader和AppClassLoader。由于引導(dǎo)類加載器涉及到虛擬機(jī)本地實(shí)現(xiàn)細(xì)節(jié),開發(fā)者無(wú)法直接獲取到啟動(dòng)類加載器的引用,所以不允許直接通過(guò)引用進(jìn)行操作

ExtClassLoader (標(biāo)準(zhǔn)擴(kuò)展類加載器)

java編寫,加載擴(kuò)展庫(kù),如classpath中的jre,javax.*或者

java.ext.dir指定位置中的類,開發(fā)者可以直接使用標(biāo)準(zhǔn)擴(kuò)展類加載器。

AppClassLoader(系統(tǒng)類加載器)

java編寫,加載程序所在的目錄,如user.dir所在的位置的class

CustomClassLoader(用戶自定義類加載器)

java編寫,用戶自定義的類加載器,可加載指定路徑的class文件


雙親委派模型工作工程:

  1.當(dāng)Application ClassLoader 收到一個(gè)類加載請(qǐng)求時(shí),他首先不會(huì)自己去嘗試加載這個(gè)類,而是將這個(gè)請(qǐng)求委派給父類加載器Extension ClassLoader去完成。??

? ? ? ?2.當(dāng)Extension ClassLoader收到一個(gè)類加載請(qǐng)求時(shí),他首先也不會(huì)自己去嘗試加載這個(gè)類,而是將請(qǐng)求委派給父類加載器Bootstrap ClassLoader去完成。??

  3.如果Bootstrap ClassLoader加載失敗(在<JAVA_HOME>\lib中未找到所需類),就會(huì)讓Extension ClassLoader嘗試加載。??

  4.如果Extension ClassLoader也加載失敗,就會(huì)使用Application ClassLoader加載。??

  5.如果Application ClassLoader也加載失敗,就會(huì)使用自定義加載器去嘗試加載。??

  6.如果均加載失敗,就會(huì)拋出ClassNotFoundException異常。

例子:

當(dāng)一個(gè)Hello.class這樣的文件要被加載時(shí)。不考慮我們自定義類加載器,首先會(huì)在AppClassLoader中檢查是否加載過(guò),如果有那就無(wú)需再加載了。如果沒有,那么會(huì)拿到父加載器,然后調(diào)用父加載器的loadClass方法。父類中同理會(huì)先檢查自己是否已經(jīng)加載過(guò),如果沒有再往上。注意這個(gè)過(guò)程,直到到達(dá)Bootstrap classLoader之前,都是沒有哪個(gè)加載器自己選擇加載的。如果父加載器無(wú)法加載,會(huì)下沉到子加載器去加載,一直到最底層,如果沒有任何加載器能加載,就會(huì)拋出ClassNotFoundException。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容