02-類加載器及雙親委托機制

Java虛擬機自帶的類加載器

BootStrap ClassLoader(啟動/根類加載器)

是由底層虛擬機來加載的類加載器桥胞,該類加載器無父加載器恳守。由它來加載Java語言的核心類庫,如java.lang等包下的類贩虾,因此java.lang.Object也是由該加載器來加載催烘。默認情況下該加載器是根據(jù)系統(tǒng)屬性sun.boot.class.path來加載對應(yīng)類庫,一般情況下主要是rt.jar中的文件缎罢。該類加載器的實現(xiàn)依賴底層操作系統(tǒng)伊群,是虛擬機實現(xiàn)的一部分。它并不是java.lang.ClassLoader的子類策精,它是由C++編寫的舰始。

注意,如果隨意修改sun.boot.class.path這個系統(tǒng)屬性咽袜,可能導(dǎo)致無法加載java.lang.Object這個類從而造成虛擬機啟動失敗丸卷。

Extension ClassLoader(擴展類加載器)

它是純Java編寫的,是java.lang.ClassLoader的子類询刹。由BootStrap ClassLoader來加載谜嫉,從層級結(jié)構(gòu)上來看是BootStrap ClassLoader的下級,它從java.ext.dir位置處加載類范抓,或者從JDK安裝路徑下jre/lib/ext目錄下加載類骄恶。如果用戶將自己的jar放在這個路徑下也會由擴展類加載器來加載。

App ClassLoader(應(yīng)用/系統(tǒng)類加載器)

又稱系統(tǒng)類加載器匕垫,原因是在ClassLoader類中的getSystemClassLoader()方法獲取到的就是AppClassLoader,因此也叫系統(tǒng)類加載器虐呻。從層級結(jié)構(gòu)上來看象泵,他是Ext ClassLoader的下級,同時默認情況下它也是所有用戶自定義類加載器的直接上級(parent)斟叼。它從環(huán)境變量classpath或java.class.path下加載類偶惠。它也是由純Java編寫,是java.lang.ClassLoader的子類朗涩。

用戶自定義的類加載器

Java提供了抽象類java.lang.ClassLoader忽孽,所有自定義類加載器都需要繼承java.lang.ClassLoader,用戶可以自定義加載邏輯。

如何創(chuàng)建自定義類加載器

繼承java.lang.ClassLoader兄一,重寫findClass方法返回類的Class對象厘线。

雙親委托機制

什么是雙親委托機制

在雙親委托機制下,各個類加載器之間呈樹型結(jié)構(gòu)出革。除了根類加載器之外造壮,其他類加載器有且只有一個雙親(parent)。而根類加載器在HotSpot虛擬機中的parent為null骂束。其示意圖如下:

BootStrapClassLoader

? ↑

? |

? ExtClassLoader

? ↑

? |

? AppClassLoader

? ↑

? |

用戶自定義的ClassLoader

在需要加載類時從下往上依次委托耳璧,當某個ClassLoader需要加載某個類時,首先是使用parent類加載器來加載展箱,parent類加載器拿到這個加載請求后繼續(xù)轉(zhuǎn)交給自己的parent旨枯,直到根類加載器,由根類加載器開始加載混驰,如果無法加載該類則向下返回召廷,從上往下依次加載,直到加載成功或失敗拋出ClassNotFoundException账胧。

雙親委托機制的優(yōu)缺點

優(yōu)點

雙親委托機制可以明顯的提高軟件的安全性竞慢,因為用戶自定義的類加載器永遠不可能加載到本該有parent加載器來加載的可靠類,從而防止不可靠甚至是惡意代碼代替了父加載器加載的可靠代碼治泥,例如java.lang.Object類是由根類加載器來加載的筹煮,因此其他任何自定義的類加載器都無法加載含有惡意代碼的java.lang.Object類。

缺點

缺點是在應(yīng)對SPI這種情況時會造成無法加載實現(xiàn)類的問題居夹。

雙親委托機制中存在一個隱含的關(guān)系是一個類是由某個類加載器加載的败潦,那么它所引用的其他類都是由該類加載器來加載,例如JDBC中Driver接口是由根類加載器加載的准脂,那么在正常情況下它的實現(xiàn)類也會由根類加載器來加載劫扒,當正常情況下實現(xiàn)類都是廠商提供的jar包,我們一般會放在classpath中狸膏,因此需要使用應(yīng)用類加載器來加載沟饥。這時就需要使用線程上下文類加載器(Thread.currentThread().getContextClassLoader())來解決。借助這種機制可以打破雙親委托機制限制湾戳。典型的示例是ServiceLoader中實現(xiàn)贤旷。感興趣可以自己參考ServiceLoader的實現(xiàn)過程。

類加載器的命名空間

什么是命名空間

每個類加載器都有自己的命名空間砾脑,命名空間由該類加載器及其所有父類加載器說加載的所有類構(gòu)成

命名空間的特點

在同一個命名空間中不會存在類的完整名稱完全相同的兩個類幼驶,但在不同命名空間中可以存在。因此如果兩個類在不同命名空間中相互調(diào)用韧衣,會報ClassCastException盅藻,即使兩個類實際上是同一個類购桑。

命名空間的可見性

根據(jù)命名空間的定義可以知道

  • 如果兩個類之間沒有明確的父子關(guān)系,那么他們的命名空間是相互不可見的氏淑。
  • 另外由于子加載器的命名空間包含了所有父類加載的所加載的類勃蜘,因此父類加載器的命名空間對子類加載器的命名空間是可見的。
  • 同理可知子類加載器的命名空間對父類加載器是不可見的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夸政,一起剝皮案震驚了整個濱河市元旬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌守问,老刑警劉巖匀归,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耗帕,居然都是意外死亡穆端,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門仿便,熙熙樓的掌柜王于貴愁眉苦臉地迎上來体啰,“玉大人,你說我怎么就攤上這事嗽仪』挠拢” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵闻坚,是天一觀的道長沽翔。 經(jīng)常有香客問我,道長窿凤,這世上最難降的妖魔是什么仅偎? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮雳殊,結(jié)果婚禮上橘沥,老公的妹妹穿的比我還像新娘。我一直安慰自己夯秃,他們只是感情好座咆,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寝并,像睡著了一般箫措。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衬潦,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音植酥,去河邊找鬼镀岛。 笑死弦牡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的漂羊。 我是一名探鬼主播驾锰,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼走越!你這毒婦竟也來了椭豫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤旨指,失蹤者是張志新(化名)和其女友劉穎赏酥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谆构,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡裸扶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搬素。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呵晨。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖熬尺,靈堂內(nèi)的尸體忽然破棺而出摸屠,到底是詐尸還是另有隱情,我是刑警寧澤粱哼,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布季二,位于F島的核電站,受9級特大地震影響皂吮,放射性物質(zhì)發(fā)生泄漏戒傻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一蜂筹、第九天 我趴在偏房一處隱蔽的房頂上張望需纳。 院中可真熱鬧,春花似錦艺挪、人聲如沸不翩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽口蝠。三九已至,卻和暖如春津坑,著一層夾襖步出監(jiān)牢的瞬間妙蔗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工疆瑰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昙啄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓寸五,卻偏偏與公主長得像梳凛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子韧拒,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348