JVM類加載器子系統(tǒng)ClassLoader

1 類加載器與類的加載過(guò)程

類加載器子系統(tǒng)的作用:類加載子系統(tǒng)負(fù)責(zé)從文件或者網(wǎng)絡(luò)中加載class文件泵殴,class文件在文件頭有特定的文件標(biāo)識(shí)笑诅。

類的加載過(guò)程:

加載:

1)通過(guò)一個(gè)類的全限定名獲取定義此類的二進(jìn)制字節(jié)流

2)將這個(gè)字節(jié)流所表示的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)

3)在內(nèi)存中生成一個(gè)代表這個(gè)java.lang.Class對(duì)象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問(wèn)入口弦叶。

鏈接:

1)驗(yàn)證:目的在于確保class文件的字節(jié)流中包含信息符合當(dāng)前虛擬機(jī)要求湾蔓,保證被加載類的正確性砌梆,不會(huì)危害虛擬機(jī)的自身安全贬循。

主要包括:文件格式驗(yàn)證,元數(shù)據(jù)驗(yàn)證杖虾,字節(jié)碼驗(yàn)證,符號(hào)引用驗(yàn)證奇适。

2)準(zhǔn)備:為類變量分配內(nèi)存空間,并賦初始默認(rèn)值嚷往。這里不包括final修飾的static皮仁,因?yàn)閒inal修飾的在編譯時(shí)就會(huì)分配了,準(zhǔn)備階段會(huì)顯式初始化贷祈。虛方法表也在此階段創(chuàng)建并開(kāi)始初始化,類的變量初始值準(zhǔn)備完成后呜达,jvm會(huì)把類的方法表也初始化完畢查近。

非前向引用:靜態(tài)代碼塊可以給定義在靜態(tài)代碼塊后的靜態(tài)變量賦值,但是不能調(diào)用勋锤。

3)解析:將常量池內(nèi)的符號(hào)引用轉(zhuǎn)壞為直接引用的過(guò)程叁执。

初始化:

初始化階段就是執(zhí)行類構(gòu)造器<clinit>()的過(guò)程矮冬,此方法不需要定義胎署,是javac編輯器自動(dòng)手機(jī)所有類變量的賦值動(dòng)作和靜態(tài)代碼塊中的語(yǔ)句合并而來(lái)。<clinit>()不同于類的構(gòu)造器恢筝,如果具有父類巨坊,jvm會(huì)保證子類的<clinit>()執(zhí)行前,父類的<clinit>()已經(jīng)執(zhí)行完畢趾撵。

2 類加載器分類

jvm支持兩周類加載器侄柔,分別為引導(dǎo)類加載器(Bootstrap ClassLader,和自定義加載器(User-Definedd ClassLoader).自定義加載器不僅是指開(kāi)發(fā)人員自己定義的類加載器占调,而是將所有派生類生于抽象類ClassLoader的類加載器都劃分為自定義類加載器暂题。

常用的三個(gè)類加載器:

1)啟動(dòng)類加載器(引導(dǎo)類加載器究珊,Bootstrap ClassLoader)

這個(gè)類加載器使用C/C++語(yǔ)言實(shí)現(xiàn)薪者,嵌套在jvm內(nèi)部苦银,用于記載java核心庫(kù)(JAVA_HOME/jre/lib/rt.jar啸胧、resources.jar或sun.boot.class.path路徑下的內(nèi)容),用于提供jvm自身需要的類幔虏。

并不繼承java.lang.ClassLoader,沒(méi)有父加載器。

出于安全考慮想括,Bootstrap啟動(dòng)類加載器只加載包名為java陷谱、javax、sun等開(kāi)頭的類。

2)擴(kuò)展類加載器(Extension ClassLoader)

由java語(yǔ)言編寫(xiě)烟逊,派生自ClassLoader類,父類加載器為啟動(dòng)類加載器宪躯。從java.ext.dirs系統(tǒng)屬性所指定的目錄中加載類庫(kù)乔宿,或從jdk安裝目錄的jre/lib/ext子目錄(擴(kuò)展目錄)下安裝類庫(kù)详瑞。如果用戶創(chuàng)建的jar在此目錄下坝橡,也會(huì)自動(dòng)由擴(kuò)展類加載器加載计寇。

3)應(yīng)用程序類加載器(AppClassLoader)

java語(yǔ)言編寫(xiě),派生于ClassLoader類番宁,父類加載器為擴(kuò)展類加載器贝淤,負(fù)責(zé)加載環(huán)境變量classpath或系統(tǒng)屬性java.class.path指定下的類庫(kù)柒竞。此類加載器是程序中默認(rèn)的加載器政供,一般來(lái)說(shuō),java應(yīng)用的類都是由它來(lái)完成的朽基。

3 ClassLoader的使用說(shuō)明

ClassLoader類是一個(gè)抽象類布隔,除了引導(dǎo)類加載器外斗繼承自ClassLoader。

sun.mis.Laucher是一個(gè)虛擬機(jī)的入口應(yīng)用稼虎,擴(kuò)展類加載器和應(yīng)用程序類加載器都是都是其定義的內(nèi)部類衅檀。

獲取ClassLoaderd的途徑:

如果是String等java核心類庫(kù),由引導(dǎo)類加載器加載霎俩,因?yàn)槭怯蒫/c++編寫(xiě)哀军,所以獲取不到相應(yīng)的對(duì)象,獲取為null打却。

1)獲取當(dāng)前類的classloader :clazz.getClassLoader()

2)獲取當(dāng)前線程上下文的ClassLoader:Thread.currentThread().getContextClassLoader()

3)獲取系統(tǒng)的ClassLoader:CladdLoader.getSystemClassLoader()

4)獲取調(diào)用者的ClassLoaderL:DriverManager.getCallerClassLoader()

4 雙親委派機(jī)制

工作原理:如果一個(gè)類加載器收到了類加載請(qǐng)求杉适,它并不會(huì)自己先去加載,而是把這個(gè)請(qǐng)求委托給父類加載器去執(zhí)行柳击,直到向上委托至最頂層的啟動(dòng)類加載器猿推。如果父類能夠完成類加載任務(wù),就成功返回,如果不能蹬叭,子加載器才會(huì)嘗試自己去加載藕咏。

優(yōu)勢(shì):避免類的重復(fù)加載。保護(hù)程序安全秽五,防止API被隨意篡改孽查。

沙箱安全機(jī)制:

自定義String類,但是在加載自定義String類的時(shí)候會(huì)率先使用引導(dǎo)類加載器加載坦喘,而引導(dǎo)類加載器在加載的過(guò)程中會(huì)先加載jdk自帶的文件卦碾,報(bào)錯(cuò)信息說(shuō)沒(méi)有main方法就是因?yàn)榧虞d的是rt.jar中的string類。這樣可以保證對(duì)java核心源代碼的保護(hù)起宽,這就是沙箱安全機(jī)制洲胖。

其他:

1)在jvm中表示兩個(gè)class對(duì)象是否為同一個(gè)類存在的兩個(gè)必要條件:類加載的完整類名必須一致,包括包名坯沪,加載這個(gè)類的列加載器必須相同绿映。

2)jvm必須知道一個(gè)類型是由啟動(dòng)類加載器還是由用戶類加載器加載的。如果一個(gè)類型是由用戶類加載器加載的腐晾,那么jvm會(huì)將這個(gè)類加載器的一個(gè)引用作為類型信息的一部分保存在方法去中叉弦,當(dāng)解析一個(gè)類型到另外一個(gè)類型的引用的時(shí)候,jvm需要保證這兩個(gè)類的類記載器是相同的藻糖。

3)類的被動(dòng)使用不會(huì)導(dǎo)致類的初始化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淹冰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巨柒,更是在濱河造成了極大的恐慌樱拴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洋满,死亡現(xiàn)場(chǎng)離奇詭異晶乔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)牺勾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)正罢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人驻民,你說(shuō)我怎么就攤上這事翻具。” “怎么了回还?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵裆泳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我懦趋,道長(zhǎng)晾虑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮帜篇,結(jié)果婚禮上糙捺,老公的妹妹穿的比我還像新娘。我一直安慰自己笙隙,他們只是感情好洪灯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著竟痰,像睡著了一般签钩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坏快,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天铅檩,我揣著相機(jī)與錄音,去河邊找鬼莽鸿。 笑死昧旨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祥得。 我是一名探鬼主播兔沃,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼级及!你這毒婦竟也來(lái)了乒疏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饮焦,失蹤者是張志新(化名)和其女友劉穎怕吴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體追驴,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡械哟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了殿雪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锋爪,死狀恐怖丙曙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情其骄,我是刑警寧澤亏镰,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站拯爽,受9級(jí)特大地震影響索抓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一逼肯、第九天 我趴在偏房一處隱蔽的房頂上張望耸黑。 院中可真熱鬧,春花似錦篮幢、人聲如沸大刊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缺菌。三九已至,卻和暖如春搜锰,著一層夾襖步出監(jiān)牢的瞬間伴郁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蛋叼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛾绎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓鸦列,卻偏偏與公主長(zhǎng)得像租冠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薯嗤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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