国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

類加載器以及雙親委派模型

曹金海 / 2388人閱讀

摘要:宗主引導類加載器。雙親委派模型是如何使用的我們在自定義加載器中查找是否有需要加載的文件,如果已經加載過,直接返回字節碼。

作者:畢來生
微信:878799579
1、小故事理解類加載器以及雙親委派模型

首先我們來描述一個小說場景,通過這個場景在去理解我們相關的類加載器的執行以及雙親委派模型。

上古時代有逍遙派和萬魔宗兩個宗派,互相對立。逍遙派比萬魔門更加強勢。巔峰戰力更高。

有一天萬魔宗一名長老之子的仆人外出獵物期間殺掉了一小隊逍遙派歷練弟子。可惜手腳不干凈,留下了線索。被逍遙派探子發現了自己師弟師妹被殺。消息傳回宗門后。

逍遙派收到此消息后大怒,發出戰書。定要萬魔門給個交代。萬魔門宗主收到戰書后一臉莫名其妙,這么點小事也來煩我?不知道我修煉有多重要嗎?不就是殺了幾個人么?遂叫來大長老,“大長老你看看這戰書,這么點事情還辦不好還要我親自來處理?要你有什么用 ? 你去準備點東西把這件事情處理一下。退下吧!”

大長老灰溜溜的回去。叫來自己的兒子。上去就抽了一巴掌,看看你辦的好事。我不管了。你自己想辦法解決,解決不了就別回來了。

大長老之子哭喪著臉回到了自己的府邸。從自己的寶庫挑出一些珍寶前去拜訪逍遙門,看能不能通過這些珍寶解決這件事情。結果,到了逍遙派門前,守衛一看就這么點東西就想交代。對萬魔門大長老之子說:"趕緊滾關進滾,就這么點東西還想給我們交代?把殺了我們師弟師妹的人帶過來,不然這事兒不算完。“

大長老之子那叫一個憋屈呀,寶物什么的他們也不要,看樣子他們是鐵了心想要哪些殺了他們的罪魁禍首。那就把他們交出去把。他們惹的事。讓他們自己解決。遂派人抓捕這些人送往逍遙派,此事才得以平息。

2、小故事角色行為分析

下面我們通過一張關系圖來分析一下我們的故事場景以及對應我們類加載器之間的關系

通過這個圖我們可以了解到我們的小故事中與我們Java中的類加載器的對應關系。

1、宗主:引導類加載器。這個類加載使用C++語言實現的,是虛擬機自身的一部分,它負責將 /lib路徑下的核心類庫或-Xbootclasspath參數指定的路徑下的jar包加載到內存中,注意必由于虛擬機是按照文件名識別加載jar包的,如rt.jar,如果文件名不被虛擬機識別,即使把jar包丟到lib目錄下也是沒有作用的(出于安全考慮,Bootstrap啟動類加載器只加載包名為java、javax、sun等開頭的類)。

2、長老:拓展類加載器。,它負責加載/lib/ext目錄下或者由系統變量-Djava.ext.dir指定位路徑中的類庫,開發人員可以直接使用標準擴展類加載器。

3、長老之子:系統類加載器。,它負責加載系統類路徑java -classpath或-D java.class.path 指定路徑下的類庫,也就是我們經常用到的classpath路徑,開發者可以直接使用系統類加載器,一般情況下該類加載是程序中默認的類加載器,通過ClassLoader類中的getSystemClassLoader()方法可以獲取到該類加載器。

4、長老之子的下人:自定義類加載器。,它需要如下步驟才可以實現自定義效果

4.1. 繼承java.lang.ClassLoader

4.2. 重寫findClass()方法

4.3 調用defineClass()方法

雙親委派模型

1、什么是雙親委派模型?

特定的類加載器在接到加載類的請求時,首先將加載任務委托給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載。

2、雙親委派模型是如何使用的?

1)我們在自定義加載器中查找是否有需要加載的文件,如果已經加載過,直接返回字節碼。

對應故事場景為:長老之子的下人自己解決不了,找到長老之子

2)如果自定義加載器沒有加載過,則詢問上一層加載器(即AppClassLoader)是否已經加載過。

對應故事場景為:長老之子攜帶寶物前去拜訪解決此事

3) 如果沒有加載過,則詢問上一層加載器(ExtClassLoader)是否已經加載過。

對應故事場景為:大長老解決此事

4) 如果沒有加載過,則繼續詢問上一層加載(BoopStrap ClassLoader)是否已經加載過

對應故事場景為:宗主解決此事

5) 如果BoopStrap ClassLoader依然沒有加載過,則到自己指定類加載路徑下("sun.boot.class.path")

查看是否有對應XXX.class字節碼,有則返回,沒有則通知下一層加載器ExtClassLoader到自己指定的

類加載路徑下(java.ext.dirs)查看

6) 最后到自定義類加載器指定的路徑還沒有找到對應XXX.class字節碼,則拋出異常ClassNotFoundException

雙親委派有什么好處呢?

1、比如兩個類A和類B都要加載Integer類:

如果不用委托而是自己加載自己的,那么類A就會加載一份Integer字節碼,然后類B又會加載一份Integer字節碼,這樣內存中就出現了兩份Integer字節碼。

如果使用委托機制,會遞歸的向父類查找,也就是首選用Bootstrap嘗試加載,如果找不到再向下。這里的Integer就能在Bootstrap中找到然后加載,如果此時類B也要加載Integer,也從Bootstrap開始,此時Bootstrap發現已經加載過了Integer那么直接返回內存中的Integer而不需要重新加載,這樣內存中就只有一份Integer的字節碼了。

2、 安全性:

因為ClassLoader加載的class文件來源很多,比如編譯器編譯生成的class、其他工具生成的字節碼。而有一些一些來源的class文件是不安全的,比如我們自定義一個java.lang.Integer類來覆蓋jdk中默認的Integer類。里面寫這么一句代碼 System.exit(0);

初始化這個Integer的構造器是會退出JVM,破壞應用程序的正常進行,如果使用雙親委派機制的話該Integer類永遠不會被調用,以為委托BootStrapClassLoader加載后會加載JDK中的Integer類而不會加載自定義的這個

喜歡就關注我吧

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75689.html

相關文章

  • Java的加載機制

    摘要:如果需要支持類的動態加載或需要對編譯后的字節碼文件進行解密操作等,就需要與類加載器打交道了。雙親委派模型,雙親委派模型,約定類加載器的加載機制。任何之類的字節碼都無法調用方法,因為該方法只能在類加載的過程中由調用。 jvm系列 垃圾回收基礎 JVM的編譯策略 GC的三大基礎算法 GC的三大高級算法 GC策略的評價指標 JVM信息查看 GC通用日志解讀 jvm的card table數據...

    aervon 評論0 收藏0
  • 加載機制,雙親委派模型,搞定大廠高頻面試題

    摘要:驗證驗證是連接階段的第一步,這一階段的目的是為了確保文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。字節碼驗證通過數據流和控制流分析,確定程序語義是合法的符合邏輯的。 看過這篇文章,大廠面試你「雙親委派模型」,硬氣的說一句,你怕啥? 讀該文章姿勢 打開手頭的 IDE,按照文章內容及思路進行代碼跟蹤與思考 手頭沒有 IDE,先收藏,回頭看 (萬一哪次面試問...

    Object 評論0 收藏0
  • JVM加載過程 & 雙親委派模型

    摘要:類加載過程雙親委派模型聲明文章均為本人技術筆記,轉載請注明出處類加載過程類加載機制將類描述數據從文件中加載到內存,并對數據進行,解析和初始化,最終形成被直接使用的類型。深入理解虛擬機高級特性與最佳實踐加載加載階段由類加載器負責,過程見類加載 JVM類加載過程 & 雙親委派模型 聲明 文章均為本人技術筆記,轉載請注明出處https://segmentfault.com/u/yzwall ...

    happen 評論0 收藏0
  • Java加載機制之雙親委派模型

    摘要:比如我們要加載類,無論我們用哪個類加載器去加載類,這個加載請求最終都會委托給,這樣就保證了所有加載器加載的類都是同一個類。如果沒有雙親委派模型,那就亂了套了,完全可能搞出多個不同的類。 前言 雙親委派模型是Java加載類的機制.采用雙親委派模型的好處是Java類隨著它的類加載器一起具備了一種帶有優先級的層級關系,通過這種層級關系可以避免類的重復加載. 1. 模型基礎 showImg(h...

    X_AirDu 評論0 收藏0
  • 深入理解虛擬機之虛擬機加載機制

    摘要:最終形成可以被虛擬機最直接使用的類型的過程就是虛擬機的類加載機制。即重寫一個類加載器的方法驗證驗證是連接階段的第一步,這一階段的目的是為了確保文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。 《深入理解Java虛擬機:JVM高級特性與最佳實踐(第二版》讀書筆記與常見相關面試題總結 本節常見面試題(推薦帶著問題閱讀,問題答案在文中都有提到): 簡單說說類加載過...

    MadPecker 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<