雙親委派機制

雙親委派機制 Parent Delegation Model,又稱為父級委托模型。

當某個類加載器需要加載某個.class文件時,它首先把這個任務委托給他的上級類加載器,遞歸這個操作,如果上級的類加載器沒有加載,自己才會去加載這個類。

類加載機制:編譯器把Java源文件編譯成.class文件,再由JVM裝載.class文件到內(nèi)存中,JVM裝載完成后得到一個Class對象字節(jié)碼。有了字節(jié)碼對象,接下來就可以實例化使用了。
類的加載器主要有啟動類加載器、附加類加載器、應用類加載器、用戶自定義加載器。
  • BootstrapClassLoader(啟動類加載器)
    c++編寫,加載java核心庫 java.*,構(gòu)造ExtClassLoader和AppClassLoader。由于引導類加載器涉及到虛擬機本地實現(xiàn)細節(jié),開發(fā)者無法直接獲取到啟動類加載器的引用,所以不允許直接通過引用進行操作。
  • ExtClassLoader (標準擴展類加載器)
    java編寫,加載擴展庫,如classpath中的jre ,javax.*或者java.ext.dir 指定位置中的類,開發(fā)者可以直接使用標準擴展類加載器。
  • AppClassLoader(系統(tǒng)類加載器)
    java編寫,加載程序所在的目錄,如user.dir所在的位置的class
  • CustomClassLoader(用戶自定義類加載器)
    java編寫,用戶自定義的類加載器,可加載指定路徑的class文件

雙親委派機制,是按照加載器的層級關(guān)系,逐層進行委派。


要加載一個類MyClass.class,從低層級到高層級一級一級委派,先由應用層加載器委派給擴展類加載器,再由擴展類委派給啟動類加載器;啟動類加載器載入失敗,再由擴展類加載器載入,擴展類加載器載入失敗,最后由應用類加載器載入,如果應用類加載器也找不到那就報ClassNotFound異常了。

雙親委派機制的作用

1、保證安全性
防止重復加載同一個.class。通過委托去向上面問一問,加載過了,就不用再加載一遍。保證數(shù)據(jù)安全。

2、保證唯一性
保證核心.class不能被篡改。通過委托方式,不會去篡改核心.clas,即使篡改也不會去加載,即使加載也不會是同一個.class對象了。不同的加載器加載同一個.class也不是同一個Class對象。這樣保證了Class執(zhí)行安全。

試想,如果沒有雙親委派模型而是由各個類加載器自行加載的話,如果用戶編寫了一個java.lang.Object的同名類并放在ClassPath中,多個類加載器都去加載這個類到內(nèi)存中,系統(tǒng)中將會出現(xiàn)多個不同的Object類,那么類之間的比較結(jié)果及類的唯一性將無法保證,因為Object都各不相同那么程序運行啟動就會出錯,也保證了JVM能夠正常的安全運行。

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

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

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