何為雙親委派

本篇內(nèi)容介紹了“何為雙親委派”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、青秀網(wǎng)絡(luò)推廣、成都微信小程序、青秀網(wǎng)絡(luò)營銷、青秀企業(yè)策劃、青秀品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供青秀建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:bm7419.com

雙親委派機(jī)制
??雙親委派機(jī)制是指當(dāng)一個(gè)類加載器收到一個(gè)類加載請求時(shí),該類加載器首先會(huì)把請求委派給父類加載器。每個(gè)類加載器都是如此(遞歸的去查找),只有在父類加載器在自己的搜索范圍內(nèi)找不到指定類時(shí),子類加載器才會(huì)嘗試自己去加載。
顯然,在介紹雙親委派機(jī)制的時(shí)候,不得不提ClassLoader。再說ClassLoader之前,我們得先了解下Java的基本知識(shí)。
Java是運(yùn)行在Java的虛擬機(jī)(JVM)中的,但是它是怎么就運(yùn)行在JVM中了呢?我們在IDE中編寫的Java源代碼被編譯器編譯成.class的字節(jié)碼文件。然后由我們的ClassLoader負(fù)責(zé)將這些class文件加載到JVM中去執(zhí)行。
JVM中提供了三層的ClassLoader:

Bootstrap ClassLoader(啟動(dòng)類加載器):主要負(fù)責(zé)加載核心的類庫(java.lang.*等),構(gòu)造Extension ClassLoaderApplication ClassLoader。

Extension ClassLoader(擴(kuò)展類加載器):主要負(fù)責(zé)加載jre/lib/ext目錄下的一些擴(kuò)展的jar。

Application ClassLoader(應(yīng)用程序類加載器):主要負(fù)責(zé)加載應(yīng)用程序的主函數(shù)類。

最后一個(gè)CustomClassLoader(用戶自定義類加載器)java編寫,用戶自定義的類加載器,可加載指定路徑的class文件。
何為雙親委派

那如果有一個(gè)Hello.class文件是如何被加載到JVM中的呢?
我們簡單看一下源碼

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// 首先檢查這個(gè)classsh是否已經(jīng)加載過了Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {// c==null表示沒有加載,如果有父類的加載器則讓父類加載器加載if (parent != null) {c = parent.loadClass(name, false);} else {//如果父類的加載器為空 則說明遞歸到bootStrapClassloader了//bootStrapClassloader比較特殊無法通過get獲取c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {}if (c == null) {//如果bootstrapClassLoader 仍然沒有加載過,則遞歸回來,嘗試自己去加載classlong t1 = System.nanoTime();c = findClass(name);sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

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

于是,我們就可以很好的總結(jié)雙親委派機(jī)制的工作流程了:

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

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

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

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

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

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

雙親委派機(jī)制的作用
1、防止重復(fù)加載同一個(gè).class。通過委托去向上面問一問,加載過了,就不用再加載一遍。保證數(shù)據(jù)安全。
2、保證核心.class不能被篡改。通過委托方式,不會(huì)去篡改核心.class,即使篡改也不會(huì)去加載,即使加載也不會(huì)是同一個(gè).class對象了。不同的加載器加載同一個(gè).class也不是同一個(gè)Class對象。這樣保證了Class執(zhí)行安全。

舉個(gè)栗子:如果有人想替換系統(tǒng)級(jí)別的類:String.java。篡改它的實(shí)現(xiàn),但是在這種機(jī)制下這些系統(tǒng)的類已經(jīng)被Bootstrap ClassLoader加載過了,所以并不會(huì)再去加載,從一定程度上防止了危險(xiǎn)代碼的植入。

“何為雙親委派”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

文章標(biāo)題:何為雙親委派
文章起源:http://bm7419.com/article10/pceggo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、云服務(wù)器手機(jī)網(wǎng)站建設(shè)、商城網(wǎng)站、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作