破壞雙親委派模型

1.第一次破壞

由于雙親委派模型是在JDK1.2之后才被引入的,而類加載器和抽象類java.lang.ClassLoader則在JDK1.0時代就已經(jīng)存在癌淮,面對已經(jīng)存在的用戶自定義類加載器的實現(xiàn)代碼玄呛,Java設計者引入雙親委派模型時不得不做出一些妥協(xié)蛉顽。在此之前尤筐,用戶去繼承java.lang.ClassLoader的唯一目的就是為了重寫loadClass()方法诉探,因為虛擬機在進行類加載的時候會調(diào)用加載器的私有方法loadClassInternal()日熬,而這個方法唯一邏輯就是去調(diào)用自己的loadClass()。

2.第二次破壞

雙親委派模型的第二次“被破壞”是由這個模型自身的缺陷所導致的阵具,雙親委派很好地解決了各個類加載器的基礎類的同一問題(越基礎的類由越上層的加載器進行加載)碍遍,基礎類之所以稱為“基礎”,是因為它們總是作為被用戶代碼調(diào)用的API阳液,但世事往往沒有絕對的完美怕敬。

如果基礎類又要調(diào)用回用戶的代碼,那該么辦帘皿?

一個典型的例子就是JNDI服務东跪,JNDI現(xiàn)在已經(jīng)是Java的標準服務,
它的代碼由啟動類加載器去加載(在JDK1.3時放進去的rt.jar),但JNDI的目的就是對資源進行集中管理和查找虽填,它需要調(diào)用由獨立廠商實現(xiàn)并部署在應用程序的ClassPath下的JNDI接口提供者的代碼丁恭,但啟動類加載器不可能“認識”這些代碼。

為了解決這個問題斋日,Java設計團隊只好引入了一個不太優(yōu)雅的設計:線程上下文類加載器(Thread Context ClassLoader)牲览。這個類加載器可以通過java.lang.Thread類的setContextClassLoader()方法進行設置,如果創(chuàng)建線程時還未設置恶守,他將會從父線程中繼承一個第献,如果在應用程序的全局范圍內(nèi)都沒有設置過的話,那這個類加載器默認就是應用程序類加載器兔港。

有了線程上下文加載器庸毫,JNDI服務就可以使用它去加載所需要的SPI代碼,也就是父類加載器請求子類加載器去完成類加載的動作衫樊,這種行為實際上就是打通了雙親委派模型層次結構來逆向使用類加載器飒赃,實際上已經(jīng)違背了雙親委派模型的一般性原則,但這也是無可奈何的事情科侈。Java中所有涉及SPI的加載動作基本上都采用這種方式载佳,例如JNDI、JDBC兑徘、JCE刚盈、JAXB和JBI等。

3.第三次破壞

雙親委派模型的第三次“被破壞”是由于用戶對程序動態(tài)性的追求導致的挂脑,這里所說的“動態(tài)性”指的是當前一些非撑菏“熱門”的名詞:代碼熱替換、模塊熱部署等崭闲,簡答的說就是機器不用重啟肋联,只要部署上就能用。
OSGi實現(xiàn)模塊化熱部署的關鍵則是它自定義的類加載器機制的實現(xiàn)刁俭。每一個程序模塊(Bundle)都有一個自己的類加載器橄仍,當需要更換一個Bundle時,就把Bundle連同類加載器一起換掉以實現(xiàn)代碼的熱替換牍戚。在OSGi幻境下侮繁,類加載器不再是雙親委派模型中的樹狀結構,而是進一步發(fā)展為更加復雜的網(wǎng)狀結構如孝,當受到類加載請求時宪哩,OSGi將按照下面的順序進行類搜索:
1)將java.*開頭的類委派給父類加載器加載。
2)否則第晰,將委派列表名單內(nèi)的類委派給父類加載器加載锁孟。
3)否則彬祖,將Import列表中的類委派給Export這個類的Bundle的類加載器加載。
4)否則品抽,查找當前Bundle的ClassPath储笑,使用自己的類加載器加載。
5)否則圆恤,查找類是否在自己的Fragment Bundle中突倍,如果在,則委派給Fragment Bundle的類加載器加載哑了。
6)否則赘方,查找Dynamic Import列表的Bundle,委派給對應Bundle的類加載器加載弱左。
7)否則,類加載器失敗炕淮。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拆火,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涂圆,更是在濱河造成了極大的恐慌们镜,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件润歉,死亡現(xiàn)場離奇詭異模狭,居然都是意外死亡,警方通過查閱死者的電腦和手機踩衩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門嚼鹉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驱富,你說我怎么就攤上這事锚赤。” “怎么了褐鸥?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵线脚,是天一觀的道長。 經(jīng)常有香客問我叫榕,道長浑侥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任晰绎,我火速辦了婚禮寓落,結果婚禮上,老公的妹妹穿的比我還像新娘寒匙。我一直安慰自己零如,他們只是感情好躏将,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著考蕾,像睡著了一般祸憋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肖卧,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天蚯窥,我揣著相機與錄音,去河邊找鬼塞帐。 笑死拦赠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的葵姥。 我是一名探鬼主播荷鼠,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼榔幸!你這毒婦竟也來了允乐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤削咆,失蹤者是張志新(化名)和其女友劉穎牍疏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拨齐,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鳞陨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞻惋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厦滤。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖熟史,靈堂內(nèi)的尸體忽然破棺而出馁害,到底是詐尸還是另有隱情,我是刑警寧澤蹂匹,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布碘菜,位于F島的核電站,受9級特大地震影響限寞,放射性物質(zhì)發(fā)生泄漏忍啸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一履植、第九天 我趴在偏房一處隱蔽的房頂上張望计雌。 院中可真熱鬧,春花似錦玫霎、人聲如沸凿滤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翁脆。三九已至眷蚓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間反番,已是汗流浹背沙热。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留罢缸,地道東北人篙贸。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像枫疆,于是被迫代替她去往敵國和親爵川。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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