類的加載機制

類的加載器

????類加載器(ClassLoader)杠河,即加載類的東西薛训。在我們使用一個類之前呐能,JVM(JAVA虛擬機)需要先將該類的字節(jié)碼文件(.class文件)從磁盤隶糕、網(wǎng)絡(luò)或其他來源加載到內(nèi)存中冈在,并對字節(jié)碼進行解析生成對應(yīng)的Class對象倒慧,這就是類加載器的功能。我們可以利用類加載器包券,實現(xiàn)類的動態(tài)加載纫谅。

? ? 類的字節(jié)碼可以來自于磁盤文件 *.class,也可以是 jar 包里的 *.class,也可以來自遠程服務(wù)器提供的字節(jié)流优烧,字節(jié)碼的本質(zhì)就是一個字節(jié)數(shù)組 []byte俺叭,它有特定的復(fù)雜的內(nèi)部格式。

延遲加載

????JVM 運行并不是一次性加載所需要的全部類的盹牧,它是按需加載俩垃,也就是延遲加載。程序在運行的過程中會逐漸遇到很多不認識的新類汰寓,這時候就會調(diào)用 ClassLoader 來加載這些類口柳。加載完成后就會將 Class 對象存在 ClassLoader 里面,下次就不需要重新加載了有滑。比如你在調(diào)用某個類的靜態(tài)方法時跃闹,首先這個類肯定是需要被加載的,但是并不會觸及這個類的實例字段毛好,那么實例字段的類別 Class 就可以暫時不必去加載望艺,但是它可能會加載靜態(tài)字段相關(guān)的類別,因為靜態(tài)方法會訪問靜態(tài)字段肌访。而實例字段的類別需要等到你實例化對象的時候才可能會加載找默。

各司其職

JVM 運行實例中會存在多個 ClassLoader,不同的 ClassLoader 會從不同的地方加載字節(jié)碼文件吼驶。JVM 中內(nèi)置了三個重要的 ClassLoader惩激,分別是:

BootStrap ClassLoader:負責(zé)加載 JVM 運行時核心類,這些類位于 JAVA_HOME/lib/rt.jar 文件中蟹演,我們常用內(nèi)置庫 java.xxx.* 都在里面风钻,比如 java.util.*、java.io.*酒请、java.nio.*骡技、java.lang.* 等等。這個 ClassLoader 比較特殊蚌父,它是由 C 代碼實現(xiàn)的哮兰,我們將它稱之為「根加載器」。

Extension ClassLoader:稱為擴展類加載器苟弛,負責(zé)加載Java的擴展類庫喝滞,默認加載JAVA_HOME/jre/lib/ext/目下的所有jar。比如 swing 系列膏秫、內(nèi)置的 js 引擎右遭、xml 解析器 等等,這些庫名通常以 javax 開頭缤削。

App ClassLoader:稱為系統(tǒng)類加載器窘哈,負責(zé)加載應(yīng)用程序classpath目錄下的所有jar和class文件。我們自己編寫的代碼以及使用的第三方 jar 包通常都是由它來加載的亭敢。main 方法執(zhí)行的時候滚婉,這第一個用戶類的加載器就是 AppClassLoader。

????jdk 內(nèi)置了一個 URLClassLoader帅刀,用戶只需要傳遞規(guī)范的網(wǎng)絡(luò)路徑給構(gòu)造器让腹,就可以使用 URLClassLoader 來加載遠程類庫和本地類庫远剩。ExtensionClassLoader 和 AppClassLoader 都是 URLClassLoader 的子類,從本地文件系統(tǒng)里加載類庫骇窍。

ClassLoader 傳遞性

? ??程序在運行過程中瓜晤,遇到了一個未知的類,虛擬機的策略是使用調(diào)用者 Class 對象(正在運行一個方法調(diào)用腹纳,這個方法掛在哪個類上面痢掠,那這個類就是調(diào)用者 Class 對象)的 ClassLoader 來加載當(dāng)前未知的類。每個 Class 對象里面都有一個 classLoader 屬性記錄了當(dāng)前的類是由誰來加載的嘲恍。因為 ClassLoader 的傳遞性足画,所有延遲加載的類都會由初始調(diào)用 main 方法的這個 ClassLoader 全全負責(zé),它就是 AppClassLoader佃牛。

雙親委派

? ???AppClassLoader 只負責(zé)加載 Classpath 下面的類庫锌云,如果遇到?jīng)]有加載的系統(tǒng)類庫怎么辦,AppClassLoader 必須將系統(tǒng)類庫的加載工作交給 BootstrapClassLoader 和 ExtensionClassLoader 來做吁脱,這就是雙親委派。這三個 ClassLoader 之間形成了級聯(lián)的父子關(guān)系彬向,每個 ClassLoader 都很懶兼贡,盡量把工作交給父親做,父親干不了了自己才會干娃胆。每個 ClassLoader 對象內(nèi)部都會有一個 parent 屬性指向它的父加載器遍希。


總結(jié):加載流程如下圖

參考:https://mp.weixin.qq.com/s/HZEFKZXu_AUr4HqD7M2H0g

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市里烦,隨后出現(xiàn)的幾起案子凿蒜,更是在濱河造成了極大的恐慌,老刑警劉巖胁黑,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件废封,死亡現(xiàn)場離奇詭異,居然都是意外死亡丧蘸,警方通過查閱死者的電腦和手機漂洋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來力喷,“玉大人刽漂,你說我怎么就攤上這事〉苊希” “怎么了贝咙?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拂募。 經(jīng)常有香客問我庭猩,道長窟她,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任眯娱,我火速辦了婚禮礁苗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徙缴。我一直安慰自己试伙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布于样。 她就那樣靜靜地躺著疏叨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪穿剖。 梳的紋絲不亂的頭發(fā)上蚤蔓,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音糊余,去河邊找鬼秀又。 笑死,一個胖子當(dāng)著我的面吹牛贬芥,可吹牛的內(nèi)容都是我干的吐辙。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蘸劈,長吁一口氣:“原來是場噩夢啊……” “哼昏苏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起威沫,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤贤惯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棒掠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孵构,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年句柠,在試婚紗的時候發(fā)現(xiàn)自己被綠了浦译。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡溯职,死狀恐怖精盅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谜酒,我是刑警寧澤叹俏,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站僻族,受9級特大地震影響粘驰,放射性物質(zhì)發(fā)生泄漏屡谐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一蝌数、第九天 我趴在偏房一處隱蔽的房頂上張望愕掏。 院中可真熱鬧,春花似錦顶伞、人聲如沸饵撑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滑潘。三九已至,卻和暖如春锨咙,著一層夾襖步出監(jiān)牢的瞬間语卤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工酪刀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粹舵,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓骂倘,卻偏偏與公主長得像齐婴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稠茂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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