Java類加載器ClassLoader

注:這是自己在復習java基礎(chǔ)知識的時候伏伐,從書本和網(wǎng)絡當中整理出來的帕翻,目前還不是很完善鸠补,歡迎大家補充和討論,謝謝嘀掸。

1. 類加載器(class loader)是用來加載java類到java虛擬機中紫岩,是JVM實現(xiàn)的一部分。與C和C++不同睬塌,java程序并不是一個可執(zhí)行文件泉蝌,而是由許多獨立的類文件組成的,每一個文件對應一個java類揩晴。此外勋陪,這些類文件并非全部裝入內(nèi)存,而是根據(jù)程序需要逐漸載入硫兰,所以就有ClassLoader產(chǎn)生诅愚。

2. 類記載器大致可以分為兩類:系統(tǒng)提供+由java應用開發(fā)人員編寫。系統(tǒng)提供主要有下面三種:

(1),bootstrap classloader劫映,也叫啟動類加載器违孝,是用C++語言寫的,是虛擬機自身的一部分泳赋。它是在Java虛擬機啟動后初始化的雌桑,它用來加載java核心的API,以滿足java程序最基本的需求摹蘑,是用原生代碼實現(xiàn)的筹燕,并不繼承自java.lang.ClassLoader。其中就包括要加載用戶自定義的ClassLoader。

(2),ExtClassLoader撒踪,擴展類加載器过咬,Bootstrap loader加載ExtClassLoader,并且將ExtClassLoader的父加載器設置為Bootstrp loader。該加載器使用java寫的制妄,它用來加載java的擴展庫掸绞,java虛擬機的實現(xiàn)會提供一個擴展庫目錄,該類加載器在此目錄里面查找并加載java類耕捞。

(3),AppClassLoader衔掸,Bootstrp loader加載完ExtClassLoader后,就會加載AppClassLoader,并且將AppClassLoader的父加載器指定為 ExtClassLoader俺抽。它也是用java寫的敞映,它根據(jù)java應用的類路徑(CLASSPATH)來加載類。一般來說磷斧,java應用的類都是由它來完成加載的振愿。通常,在沒有指定ClassLoader的情況下弛饭,程序員自定義的類就由該ClassLoader加載冕末。ClassLoader中有個getSystemClassLoader方法,此方法返回的正是AppclassLoader.


3.加載流程:JVM啟動時,運行bootstrap classloader侣颂,該ClassLoader加載java核心API(ExtClassLoader和AppClassLoader也在此時被加載)档桃,然后調(diào)用ExtClassLoader加載擴展API,最后AppClassLoader加載CLASSPATH目錄下定義的Class憔晒,這就是一個程序最基本的加載流程藻肄。

4.加載時的父類委托模式:

(1)當前ClassLoader首先從自己已經(jīng)加載的類中查詢是否此類已經(jīng)加載,如果已經(jīng)加載則直接返回原來已經(jīng)加載的類拒担。

(2)當前classLoader的緩存中沒有找到被加載的類的時候仅炊,委托父類加載器去加載,父類加載器采用同樣的策略澎蛛,首先查看自己的緩存,然后委托父類的父類去加載蜕窿,一直到bootstrap ClassLoader.

(3)當所有的父類加載器都沒有加載的時候谋逻,再由當前的類加載器加載,并將其放入它自己的緩存中桐经,以便下次有加載請求的時候直接返回毁兆。

偽代碼

//首先檢查該name指定的class是否被加載

Class c = findLoaderClass(name);

//如果該類沒有被加載,則調(diào)用父類加載器進行加載

if(c==null)

if(parent != null)

c= parent.loadClass(name,false);

//如果parent為null阴挣,則調(diào)用boottrapClassLoader進行加載

c = findBootstrapClass(name)

//如果仍然無法加載气堕,則調(diào)用自身的findClass進行加載

c = findClass(name);

這樣做的目的第一是可以避免重復加載,當父類已經(jīng)加載該類的時候,子類就沒必要再加載一次茎芭。第二就是考慮到安全因素揖膜,如果不使用這種模式,那么可以隨時使用自定義的String來動態(tài)替代Java核心API中定義的類型梅桩,這樣會存在非常大的安全隱患壹粟,而父類委托模式就可以避免這種情況,因為String已經(jīng)在啟動時被加載宿百,所以用戶自定義類是無法加載一個自定義的ClassLoader趁仙。

還有另外一種說法,引用別人的話:

Java為什么要采用這樣的委托機制垦页?理解這個問題雀费,我們引入另外一個關(guān)于Classloader的概念“命名空間”, 它是指要確定某一個類痊焊,需要類的全限定名以及加載此類的ClassLoader來共同確定盏袄。也就是說即使兩個類的全限定名是相同的,但是因為不同的 ClassLoader加載了此類宋光,那么在JVM中它是不同的類貌矿。明白了命名空間以后,我們再來看看委托模型罪佳。采用了委托模型以后加大了不同的 ClassLoader的交互能力逛漫,比如上面說的,我們JDK本生提供的類庫赘艳,比如hashmap,linkedlist等等酌毡,這些類由bootstrp 類加載器加載了以后,無論你程序中有多少個類加載器蕾管,那么這些類其實都是可以共享的枷踏,這樣就避免了不同的類加載器加載了同樣名字的不同類以后造成混亂。

5.自己實現(xiàn)ClassLoader

在絕大多數(shù)情況下系統(tǒng)默認提供的類加載器實現(xiàn)已經(jīng)可以滿足需求掰曾。但是在某些情況下旭蠕,還是需要為應用開發(fā)出自己的類加載器比如您的應用通過網(wǎng)絡來傳輸 Java 類的字節(jié)代碼旷坦,為了保證安全性掏熬,這些字節(jié)碼經(jīng)過了加密處理。這個時候您就需要自己的類加載器來從某個網(wǎng)絡地址上讀取加密后的字節(jié)代碼秒梅,接著進行解密和驗證旗芬,最后定義出要在 Java 虛擬機中運行的類來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捆蜀,一起剝皮案震驚了整個濱河市疮丛,隨后出現(xiàn)的幾起案子幔嫂,更是在濱河造成了極大的恐慌,老刑警劉巖誊薄,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件履恩,死亡現(xiàn)場離奇詭異,居然都是意外死亡暇屋,警方通過查閱死者的電腦和手機似袁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咐刨,“玉大人昙衅,你說我怎么就攤上這事《瘢” “怎么了而涉?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長联予。 經(jīng)常有香客問我啼县,道長,這世上最難降的妖魔是什么沸久? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任季眷,我火速辦了婚禮,結(jié)果婚禮上卷胯,老公的妹妹穿的比我還像新娘子刮。我一直安慰自己,他們只是感情好窑睁,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布挺峡。 她就那樣靜靜地躺著,像睡著了一般担钮。 火紅的嫁衣襯著肌膚如雪橱赠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天箫津,我揣著相機與錄音狭姨,去河邊找鬼。 笑死苏遥,一個胖子當著我的面吹牛送挑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暖眼,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纺裁!你這毒婦竟也來了诫肠?” 一聲冷哼從身側(cè)響起司澎,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栋豫,沒想到半個月后挤安,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡丧鸯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年蛤铜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丛肢。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡围肥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜂怎,到底是詐尸還是另有隱情穆刻,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布杠步,位于F島的核電站氢伟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏幽歼。R本人自食惡果不足惜朵锣,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甸私。 院中可真熱鬧诚些,春花似錦、人聲如沸颠蕴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犀被。三九已至椅您,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寡键,已是汗流浹背掀泳。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留西轩,地道東北人员舵。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像藕畔,于是被迫代替她去往敵國和親马僻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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