類加載器

今天學習工廠模式解耦操作時凯肋,誤用了properties類的類加載器去獲取配置配置文件,報了空指針異常汽馋,查class類的源碼發(fā)現(xiàn)如下內(nèi)容:

/**  Returns the class loader for the class.  Some implementations may use 
 * null to represent the bootstrap class loader. This method will return
 * null in such implementations if this class was loaded by the bootstrap class loader.

properties類的類加載器是bootstrap class loader,所以該方法返回的是null圈盔。
除了properties豹芯,我還用了object類和自定義的一些類來獲取類加載器,發(fā)現(xiàn)系統(tǒng)類使用時驱敲,都拋出了空指針異常铁蹈,而自定義的類在獲取加載器時可以正常操作

            Object o = new Object();
            ClassLoader classLoader1 = o.getClass().getClassLoader();
            IAccountDao iAccountDao = new IAccountDaoImpl();
            ClassLoader classLoader2 = iAccountDao.getClass().getClassLoader();
            System.out.println(classLoader2);
            System.out.println(classLoader1);
//運行結(jié)果是
//sun.misc.Launcher$AppClassLoader@135fbaa4
//null

通過getParent()方法可以看到分層情況:

IAccountDao iAccountDao = new IAccountDaoImpl();
            ClassLoader classLoader2 = iAccountDao.getClass().getClassLoader();
            System.out.println(classLoader2);
            System.out.println(classLoader2.getParent());
            System.out.println(classLoader2.getParent().getParent());
//結(jié)果是
//sun.misc.Launcher$AppClassLoader@135fbaa4
//sun.misc.Launcher$ExtClassLoader@2503dbd3
//null

查詢類加載器的種類時發(fā)現(xiàn),自定義的這些類是


image.png

類加載器按照層次众眨,從頂層到底層握牧,分為以下四種:

1.啟動類加載器:這個類加載器負責放在<JAVA_HOME>\lib目錄中的,或者被-Xbootclasspath參數(shù)所指定的路徑中的娩梨,并且是虛擬機識別的類庫加載到內(nèi)存中沿腰。啟動類加載器無法被Java程序直接引用。
2.擴展類加載器:這個類加載器由sun.misc.Launcher$ExtClassLoader實現(xiàn)狈定。它負責<JAVA_HOME>\lib\ext目錄中的颂龙,或者被java.ext.dirs系統(tǒng)變量所指定的路徑中的所有類庫。用戶可以直接使用纽什。
3.應用程序類加載器:這個類由sun.misc.Launcher$AppClassLoader實現(xiàn)措嵌。是ClassLoader中getSystemClassLoader()方法的返回值。它負責用戶路徑(ClassPath)所指定的類庫芦缰。用戶可以直接使用企巢。如果用戶沒有自己定義類加載器,默認使用這個让蕾。
4.自定義加載器:用戶自己定義的類加載器浪规。

雙親委派模型:

雙親委派模型要求除了頂層的啟動類加載器外,其他的類加載器都應當有自己的父類加載器涕俗。這里類加載器之間的父子關系一般不會以繼承關系來實現(xiàn)罗丰,而是都使用組合關系來復用父加載器的代碼

工作過程:

如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類再姑,而是把這個請求委派給父類加載器去完成萌抵,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳遞到頂層的啟動類加載器中,只有當父類加載器反饋自己無法完成這個請求(它的搜索范圍中沒有找到所需的類)時绍填,子加載器才會嘗試自己去加載霎桅。

好處:

Java類隨著它的類加載器一起具備了一種帶有優(yōu)先級的層次關系。例如類Object讨永,它放在rt.jar中滔驶,無論哪一個類加載器要加載這個類,最終都是委派給啟動類加載器進行加載卿闹,因此Object類在程序的各種類加載器環(huán)境中都是同一個類揭糕,判斷兩個類是否相同是通過classloader.class這種方式進行的,所以哪怕是同一個class文件如果被兩個classloader加載锻霎,那么他們也是不同的類著角。

代碼測試時,其實還發(fā)現(xiàn)了另外一個問題旋恼,就是我初始化了兩個classLoader對象吏口,打印出來發(fā)現(xiàn)這兩個對象的類加載器竟然一模一樣,為什么呢冰更?

IAccountDao iAccountDao = new IAccountDaoImpl();
            ClassLoader classLoader2 = iAccountDao.getClass().getClassLoader();
            System.out.println(classLoader2);
            System.out.println(classLoader2.getParent());
ClassLoader classLoader = BeanFactory.class.getClassLoader();
            System.out.println(classLoader);
//執(zhí)行結(jié)果是
//sun.misc.Launcher$AppClassLoader@135fbaa4
//sun.misc.Launcher$ExtClassLoader@2503dbd3
//sun.misc.Launcher$AppClassLoader@135fbaa4

答案參考:
https://blog.csdn.net/weixin_42248137/article/details/80387305

參考:
https://www.cnblogs.com/Yanss/p/11711894.html
https://www.cnblogs.com/fengbs/p/7595849.html
https://blog.csdn.net/YingHuaNanHai/article/details/81264893

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末产徊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜀细,更是在濱河造成了極大的恐慌舟铜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件审葬,死亡現(xiàn)場離奇詭異深滚,居然都是意外死亡,警方通過查閱死者的電腦和手機涣觉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門痴荐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人官册,你說我怎么就攤上這事生兆。” “怎么了膝宁?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵鸦难,是天一觀的道長。 經(jīng)常有香客問我员淫,道長合蔽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任介返,我火速辦了婚禮拴事,結(jié)果婚禮上沃斤,老公的妹妹穿的比我還像新娘。我一直安慰自己刃宵,他們只是感情好衡瓶,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牲证,像睡著了一般哮针。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坦袍,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天十厢,我揣著相機與錄音,去河邊找鬼捂齐。 笑死寿烟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的辛燥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缝其,長吁一口氣:“原來是場噩夢啊……” “哼挎塌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起内边,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榴都,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漠其,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘴高,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年和屎,在試婚紗的時候發(fā)現(xiàn)自己被綠了拴驮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡柴信,死狀恐怖套啤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情随常,我是刑警寧澤潜沦,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站绪氛,受9級特大地震影響唆鸡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枣察,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一争占、第九天 我趴在偏房一處隱蔽的房頂上張望燃逻。 院中可真熱鬧,春花似錦燃乍、人聲如沸唆樊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗旁。三九已至,卻和暖如春舆瘪,著一層夾襖步出監(jiān)牢的瞬間片效,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工英古, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淀衣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓召调,卻偏偏與公主長得像膨桥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子唠叛,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359