這篇文章主要講解了“Java的雙親委派模型是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java的雙親委派模型是什么”吧!
創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、靖江網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、商城開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為靖江等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
雙親委派模型的工作流程是:如果一個(gè)類加載器收到了類加載的請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類,而是把請(qǐng)求委托給父加載器去完成,依次向上,因此,所有的類加載請(qǐng)求最終都應(yīng)該被傳遞到頂層的啟動(dòng)類加載器中,只有當(dāng)父加載器在它的搜索范圍中沒有找到所需的類時(shí),即無法完成該加載,子加載器才會(huì)嘗試自己去加載該類。
雙親委派機(jī)制:
1、當(dāng)AppClassLoader
加載一個(gè)class時(shí),它首先不會(huì)自己去嘗試加載這個(gè)類,而是把類加載請(qǐng)求委派給父類加載器ExtClassLoader
去完成。
2、當(dāng)ExtClassLoader
加載一個(gè)class時(shí),它首先也不會(huì)自己去嘗試加載這個(gè)類,而是把類加載請(qǐng)求委派給BootStrapClassLoader“`去完成。
3、如果BootStrapClassLoader
加載失敗(例如在$JAVA_HOME/jre/lib
里未查找到該class),會(huì)使用ExtClassLoader
來嘗試加載;
4、若ExtClassLoader也加載失敗,則會(huì)使用AppClassLoader
來加載,如果AppClassLoader
也加載失敗,則會(huì)報(bào)出異常ClassNotFoundException
。
ClassLoader源碼分析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
雙親委派模型意義:
系統(tǒng)類防止內(nèi)存中出現(xiàn)多份同樣的字節(jié)碼
保證Java程序安全穩(wěn)定運(yùn)行
簡單說,類加載器就是根據(jù)指定全限定名稱將class文件加載到JVM內(nèi)存,轉(zhuǎn)為Class對(duì)象。如果站在JVM的角度來看,只存在兩種類加載器:
啟動(dòng)類加載器(Bootstrap ClassLoader):由C++語言實(shí)現(xiàn)(針對(duì)HotSpot),負(fù)責(zé)將存放在
其他類加載器:由Java語言實(shí)現(xiàn),繼承自抽象類ClassLoader。如:擴(kuò)展類加載器(Extension ClassLoader):負(fù)責(zé)加載
雙親委派模型工作過程是:如果一個(gè)類加載器收到類加載的請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類,而是把這個(gè)請(qǐng)求委派給父類加載器完成。每個(gè)類加載器都是如此,只有當(dāng)父加載器在自己的搜索范圍內(nèi)找不到指定的類時(shí)(即ClassNotFoundException),子加載器才會(huì)嘗試自己去加載。
為什么需要雙親委派模型呢?假設(shè)沒有雙親委派模型,試想一個(gè)場景:
黑客自定義一個(gè)java.lang.String類,該String類具有系統(tǒng)的String類一樣的功能,只是在某個(gè)函數(shù)稍作修改。比如equals函數(shù),這個(gè)函數(shù)經(jīng)常使用,如果在這這個(gè)函數(shù)中,黑客加入一些“病毒代碼”。并且通過自定義類加載器加入到JVM中。此時(shí),如果沒有雙親委派模型,那么JVM就可能誤以為黑客自定義的java.lang.String類是系統(tǒng)的String類,導(dǎo)致“病毒代碼”被執(zhí)行。
而有了雙親委派模型,黑客自定義的java.lang.String類永遠(yuǎn)都不會(huì)被加載進(jìn)內(nèi)存。因?yàn)槭紫仁亲铐敹说念惣虞d器加載系統(tǒng)的java.lang.String類,最終自定義的類加載器無法加載java.lang.String類。
或許你會(huì)想,我在自定義的類加載器里面強(qiáng)制加載自定義的java.lang.String類,不去通過調(diào)用父加載器不就好了嗎?確實(shí),這樣是可行。但是,在JVM中,判斷一個(gè)對(duì)象是否是某個(gè)類型時(shí),如果該對(duì)象的實(shí)際類型與待比較的類型的類加載器不同,那么會(huì)返回false。
舉個(gè)簡單例子:
ClassLoader1、ClassLoader2都加載java.lang.String類,對(duì)應(yīng)Class1、Class2對(duì)象。那么Class1對(duì)象不屬于ClassLoad2對(duì)象加載的java.lang.String類型。
感謝各位的閱讀,以上就是“Java的雙親委派模型是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Java的雙親委派模型是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!