8.類加載器

虛擬機(jī)設(shè)計團(tuán)隊把類加載階段中的“通過一個類的全限定名來獲取描述此類的二進(jìn)制字節(jié)流”這個動作放到Java虛擬機(jī)外部去實現(xiàn)稚字,以便讓應(yīng)用程序決定如何去獲取所需要的類晦雨。實現(xiàn)這個動作的代碼模塊稱為“類加載器”巷嚣。

類與類加載器

對于任意一個類克胳,都需要由加載它的類加載器和這個類本身一同確立其在Java虛擬機(jī)中的唯一性中狂,每個類加載器丁溅,都擁有一個獨(dú)立的類名稱空間。這句話可以表達(dá)得更通俗一些:比較兩個類是否“相等”义锥,只有在這兩個類是由同一個類加載器加載的前提下才有意義柳沙,否則,即使這兩個類來源于同一個Class文件拌倍,被同一個虛擬機(jī)加載赂鲤,只要加載它們的類加載器不同噪径,那這兩個類必定不相等。

這里所指的“相等”蛤袒,包括代表類的Class對象的equals()方法熄云、isAssignableFrom()方法膨更、isInstance()方法的返回結(jié)果妙真,也包括使用instanceof關(guān)鍵字做對象所屬關(guān)系判定等情況。

demo:不同的類加載器對instanceof關(guān)鍵字運(yùn)算的結(jié)果的影響

雙親委派模型

從Java虛擬機(jī)的角度來講荚守,只存在兩種不同的類加載器:一種是啟動類加載器(Boostrap ClassLoader),這個類加載器使用C++語言實現(xiàn)珍德,是虛擬機(jī)自身的一部分;另一種就是所有其他的類加載器矗漾,這些類加載器都由Java語言實現(xiàn)锈候,獨(dú)立于虛擬機(jī)外部,并且全都繼承自抽象類java.lang.ClassLoader敞贡。

從Java開發(fā)人員的角度來看泵琳,類加載器可以劃分為:啟動類加載器(Bootrap ClassLoader)、擴(kuò)展類加載器(Extension ClassLoader)誊役、應(yīng)用程序加載器(Application ClassLoader)获列。

1. 啟動類加載器:負(fù)責(zé)將<JAVA_HOME>\lib目錄中的,或者被-Xbootclasspath參數(shù)所指定的路徑中的蛔垢,并且是虛擬機(jī)識別的類庫加載到虛擬機(jī)內(nèi)存中击孩。無法被Java程序直接引用,用戶在編寫自定義加載器時鹏漆,如果需要把加載請求委派給引導(dǎo)類加載器巩梢,那直接使用null代替即可。

2. 擴(kuò)展加載器:這個加載器由sun,miscLauncher $ExtClassLoader實現(xiàn)艺玲,它負(fù)責(zé)加載<JAVA_HOME>\lib\ext目錄中的括蝠,或被java.ext.dirs系統(tǒng)變量所制定的路徑中的所有類庫,開發(fā)者可以直接使用擴(kuò)展加載器饭聚。

3. 應(yīng)用程序加載器:這個類加載器由sun.misc.Launcher $App-ClassLoader實現(xiàn)又跛。由于這個類加載器時ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也稱它為系統(tǒng)類加載器若治。它負(fù)責(zé)加載用戶類路徑(ClassPath)上所指定的類庫慨蓝,開發(fā)者可以直接使用這個類加載器,如果應(yīng)用程序中沒有自定義過自己的加載器端幼,一般情況下這個就是程序中默認(rèn)的加載器礼烈。


圖中所展示的類加載器之間的這種層次關(guān)系,稱為類加載器的雙親委派模型婆跑。雙親委派模型要求除了頂層的啟動類加載器外此熬,其余的類加載器都應(yīng)有自己的父類加載器。這里類加載器之間的父子關(guān)系一般不會以繼承的關(guān)系來實現(xiàn),而是都是用組合關(guān)系來復(fù)用父加載器的代碼犀忱。

工作流程

如果一個類加載器收到了類加載的請求募谎,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成阴汇,每一個層次的加載器都是如此数冬,因此所有的加載請求最終都應(yīng)該傳送到頂層的啟動類加載器中,只有當(dāng)父加載器反饋自己無法完成這個加載請求(它的搜索范圍中沒有找到所需的類)時搀庶,子加載器才會嘗試自己去加載拐纱。

雙親委派的優(yōu)點(diǎn)

使用雙親委派模型來組織類加載器之間的關(guān)系,好處就是Java類隨著它的類加載器一起具備了一種帶有優(yōu)先級的層次關(guān)系哥倔。最終都是委派給處于模型最頂端的啟動類加載器進(jìn)行加載秸架。相反,如果沒有使用雙親委派模型咆蒿,由各個加載器自行去加載的話东抹,如果用戶自己編寫一個稱為java.lang.Object的類,并放在程序額ClassPath中沃测,那系統(tǒng)中將會出現(xiàn)多個不同的Object類缭黔,Java類型體系中最基礎(chǔ)的行為也就無法保證,應(yīng)用程序也將會變得一片混亂芽突。

雙親委派的實現(xiàn)


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末试浙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寞蚌,更是在濱河造成了極大的恐慌田巴,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挟秤,死亡現(xiàn)場離奇詭異壹哺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)艘刚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門管宵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攀甚,你說我怎么就攤上這事箩朴。” “怎么了秋度?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵炸庞,是天一觀的道長。 經(jīng)常有香客問我荚斯,道長埠居,這世上最難降的妖魔是什么查牌? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮滥壕,結(jié)果婚禮上纸颜,老公的妹妹穿的比我還像新娘。我一直安慰自己绎橘,他們只是感情好胁孙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著金踪,像睡著了一般浊洞。 火紅的嫁衣襯著肌膚如雪牵敷。 梳的紋絲不亂的頭發(fā)上胡岔,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音枷餐,去河邊找鬼靶瘸。 笑死,一個胖子當(dāng)著我的面吹牛毛肋,可吹牛的內(nèi)容都是我干的怨咪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼润匙,長吁一口氣:“原來是場噩夢啊……” “哼诗眨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孕讳,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤匠楚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厂财,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芋簿,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年璃饱,在試婚紗的時候發(fā)現(xiàn)自己被綠了与斤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡荚恶,死狀恐怖撩穿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谒撼,我是刑警寧澤食寡,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站嗤栓,受9級特大地震影響冻河,放射性物質(zhì)發(fā)生泄漏箍邮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一叨叙、第九天 我趴在偏房一處隱蔽的房頂上張望锭弊。 院中可真熱鬧,春花似錦擂错、人聲如沸味滞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剑鞍。三九已至,卻和暖如春爽醋,著一層夾襖步出監(jiān)牢的瞬間蚁署,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工蚂四, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留光戈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓遂赠,卻偏偏與公主長得像久妆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子跷睦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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