類加載 - 被誰加載


類加載包含兩部分:一部分是被誰加載季蚂,另一部分是如何加載。
被誰加載是指 ClassLoader 的雙親委派模型,如何加載是指類的加載過程刽肠。
這篇博客介紹雙親委派模型,特別感謝 @書呆子Rico老師 的博客


ClassLoader 結(jié)構(gòu)核心思想

class ClassLoader {
    /**
     * 父加載器
     */
    ClassLoader parent;
    /**
     * 已經(jīng)加載的 class
     * 這個(gè)屬性是我假想的免胃,為了配合 {@link #findLoadedClass} 的猜想
     */
    Map<String, Class> loadedClasses;

    /**
     * 嘗試從已經(jīng)加載的類中尋找音五,如果沒有返回 null
     * 真實(shí)的實(shí)現(xiàn)是 native 方法,我猜想是存了一個(gè)類名到類實(shí)例的映射羔沙,如下
     */
    Class<?> findLoadedClass(String name){
        return loadedClasses.get(name);
    }

    /**
     * 當(dāng)前類加載器嘗試去加載一個(gè)類躺涝,內(nèi)部實(shí)現(xiàn)就是類的加載過程
     * 為什么說嘗試?因?yàn)楫?dāng)前類加載器可能無法加載這個(gè)類扼雏,會(huì)返回 null
     */
    Class<?> findClass(String name){}

    /**
     * 雙親委派模型的實(shí)現(xiàn)坚嗜,也是類加載的直接入口
     */
    Class<?> loadClass(String name){}
}

雙親委派模型

當(dāng)類加載器嘗試加載一個(gè)類時(shí),會(huì)首先查看自己加載過的類诗充。如果沒有查找到苍蔬,不是馬上去加載,而是去詢問父加載器(這是一個(gè)遞歸的過程)蝴蜓。如果父加載器也沒有加載碟绑,自己才會(huì)加載俺猿。雙親委派模型是通過組合的方式實(shí)現(xiàn)的,不是繼承格仲。

雙親委派模型圖


雙親委派實(shí)現(xiàn)自己實(shí)現(xiàn)的偽代碼

Class<?> loadClass(String name) {
    // 查找自己加載過的類
    Class<?> loadedClass = findLoadedClass(name);
    if (loadedClass == null) {
        // 嘗試讓父類加載
        if (parent == null) {
            // 調(diào)用 BootstrapClassLoader 去加載押袍,后面介紹 Java 類加載器的層級(jí)結(jié)構(gòu)
        } else {
            loadedClass = parent.loadClass(name);
        }
        // 如果父類沒有加載,自己加載
        if (loadedClass == null) {
            loadedClass = findClass(name);
        }
    }
    // 返回最終結(jié)果抓狭,此時(shí)還有可能為 null
    // 如果當(dāng)前類加載器有子加載器伯病,則子加載器還會(huì)嘗試加載,否則就會(huì)包 ClassNotFoundException
    return loadedClass;
}

雙親委派作用

  • 防止類重復(fù)加載提高效率
  • 保證核心類安全否过,無法被替換
    假設(shè)通過網(wǎng)絡(luò)傳遞一個(gè)名為java.lang.Integer的類午笛,通過雙親委托模式傳遞到啟動(dòng)類加載器,而啟動(dòng)類加載器在核心Java API發(fā)現(xiàn)這個(gè)名字的類苗桂,發(fā)現(xiàn)該類已被加載药磺,并不會(huì)重新加載網(wǎng)絡(luò)傳遞的過來的類,而直接返回已加載過的Integer.class煤伟,這樣便可以防止核心API庫被隨意篡改癌佩。

Java 類加載器層級(jí)結(jié)構(gòu)

如雙親委派模型圖中展示的,Java 中現(xiàn)有類加載器分三層便锨。

  • BootstrapClassLoader围辙,啟動(dòng)類加載器,頂級(jí)類加載器放案,由 native 實(shí)現(xiàn)姚建,加載JAVA_HOME/lib下面的核心類庫或-Xbootclasspath選項(xiàng)指定的jar包等虛擬機(jī)識(shí)別的類
  • ExtClassLoader吱殉,拓展類加載器掸冤,父加載器是BootstrapClassLoader,所以parent==null友雳,加載JAVA_HOME /lib/ext或者由系統(tǒng)變量-Djava.ext.dir指定位置中的類稿湿。
  • AppClassLoader,系統(tǒng)類加載器押赊,默認(rèn)的類加載器饺藤,也是自定義類加載器的父加載器,加載當(dāng)前類所在路徑及其引用的第三方類流礁。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涕俗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崇棠,更是在濱河造成了極大的恐慌咽袜,老刑警劉巖丸卷,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枕稀,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)萎坷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門凹联,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哆档,你說我怎么就攤上這事蔽挠。” “怎么了瓜浸?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵澳淑,是天一觀的道長。 經(jīng)常有香客問我插佛,道長杠巡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任雇寇,我火速辦了婚禮氢拥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锨侯。我一直安慰自己嫩海,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布囚痴。 她就那樣靜靜地躺著叁怪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渡讼。 梳的紋絲不亂的頭發(fā)上骂束,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音成箫,去河邊找鬼展箱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蹬昌,可吹牛的內(nèi)容都是我干的混驰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼皂贩,長吁一口氣:“原來是場噩夢啊……” “哼栖榨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起明刷,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤婴栽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辈末,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愚争,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡映皆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轰枝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捅彻。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞍陨,靈堂內(nèi)的尸體忽然破棺而出步淹,到底是詐尸還是另有隱情,我是刑警寧澤诚撵,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布缭裆,位于F島的核電站,受9級(jí)特大地震影響寿烟,放射性物質(zhì)發(fā)生泄漏幼驶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一韧衣、第九天 我趴在偏房一處隱蔽的房頂上張望盅藻。 院中可真熱鬧,春花似錦畅铭、人聲如沸氏淑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽假残。三九已至,卻和暖如春炉擅,著一層夾襖步出監(jiān)牢的瞬間辉懒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工谍失, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眶俩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓快鱼,卻偏偏與公主長得像颠印,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抹竹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容