Java之類的加載機制

類的加載是每個Java程序必經(jīng)的流程,了解類的加載機制有助于我們寫出更好的代碼。

基礎(chǔ)

概念

類的加載把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對數(shù)據(jù)進行校驗县袱、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機直接使用的Java類型佑力。

在Java語言里式散,類型的加載、連接和初始化過程都是在程序運行期間完成的打颤。顯然暴拄,這樣會增加一些運行時的開銷,不過也為Java應(yīng)用程序提供了高度的靈活性编饺,使Java天生支持動態(tài)擴展揍移。

類的生命周期

類的生命周期有7部分:加載,驗證反肋,準(zhǔn)備那伐,解析,初始化石蔗,使用和卸載罕邀。

類的生命周期

其中驗證,準(zhǔn)備养距,解析3個部分統(tǒng)稱為連接诉探。

具體過程

加載

加載(Loading)是類加載的第一步,就是將字節(jié)碼加載到JVM內(nèi)存中棍厌。官方說法如下:

  1. 通過一個類的全限定名來獲取定義此類的二進制字節(jié)流;
  2. 將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu)肾胯;
  3. 在內(nèi)存中生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口耘纱。

注:JVM在加載數(shù)組的時候加載的僅僅是數(shù)組的類型類(例如String[] 加載器只會加載String這個類型類)敬肚,而數(shù)組的創(chuàng)建則由JVM直接完成。

類加載器

為了完成加載過程中的第一條:”通過一個類的全限定名來獲取定義此類的二進制字節(jié)流”的功能束析,JVM團隊開發(fā)了一個模塊——類加載器艳馒。但是為了給用戶提供更好的拓展性JVM團隊將這個過程的代碼放到了JVM的外部,以便讓開發(fā)人員可以自定義類加載器。

注:對于任意一個類弄慰,他的唯一決定方式是:類本身+加載此類的類加載器第美。通俗的講就是:一個類java.lang.Object 如果被兩個類加載器加載,那么這個兩個類就是不相同的陆爽。

加載器的類型

從Java虛擬機的角度看什往,只有兩種不同的類加載器:

  1. 啟動類加載器(Bootstrap ClassLoader):用C++實現(xiàn),是虛擬機自身的一部分慌闭;
  2. 所有其他的類加載器:用Java語言實現(xiàn)恶守,獨立于虛擬機外部,都繼承自抽象類java.lang.ClassLoader;

從Java開發(fā)人員看贡必,類加載器可分為3種:

  1. 啟動類加載器(Bootstrap ClassLoader):負責(zé)加載<\JAVA——HOME>\lib目錄中的并且可以被虛擬機識別的;
  2. 擴展類加載器(Extension ClassLoader):負責(zé)加載<\JAVA_HOME>\lib\ext目錄中的所有類庫庸毫,開發(fā)者可以直接使用擴展類加載器仔拟;
  3. 應(yīng)用程序類加載器(Application ClassLoader):它是ClassLoader中的getSystemClassLoader()方法的返回值,所以也稱它為系統(tǒng)類加載器飒赃。他負責(zé)加載用戶類路徑(ClassPath)上所指定的類庫利花。

雙親委派模型

那么,問題來了载佳,如果用戶自定義了一個Object類放在classpath目錄下炒事,那么加載的時候會用哪個加載器呢?為了解決這個問題蔫慧,JVM團隊就提出了雙親委派模型挠乳。

首先我們要知道,除了啟動類加載器以外姑躲,其余的加載器都有自己的父類加載器睡扬。繼承關(guān)系如下圖:


類加載器

雙親委派模型就是,如果一個類加載器收到加載請求黍析,他不會馬上加載類卖怜,而是將這個請求向上傳遞給他的父加載器,看父加載器能不能加載這個類阐枣,加載的原則就是優(yōu)先父加載器加載马靠,若果父加載器加載不了,自己才能加載蔼两。

驗證

驗證是連接階段的第一步甩鳄,目的是為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機的要求,并且不會危害虛擬機自身的安全额划。

主要有4個部分:

a. 文件格式驗證

驗證字節(jié)流是否符合Class文件格式的規(guī)范娩贷,并且能被當(dāng)前版本的虛擬機處理。

b. 元數(shù)據(jù)驗證

對類的元數(shù)據(jù)信息進行語義校驗锁孟,是否不存在不符合Java語言規(guī)范的元數(shù)據(jù)信息

c. 字節(jié)碼驗證

最復(fù)雜的一個階段彬祖,主要目的是通過數(shù)據(jù)流和控制流分析茁瘦,確定程序語義是合法的,符合邏輯的储笑。對類的方法體進行校驗分析甜熔,保證被校驗類的方法在運行時不會做出危害虛擬機安全的事件。

d. 符號引用驗證

最后一個階段的校驗發(fā)生在虛擬機將符號引用轉(zhuǎn)換為直接引用的時候突倍,這個轉(zhuǎn)換動作將在連接的第三個階段——解析階段中發(fā)生腔稀。

準(zhǔn)備

類的準(zhǔn)備階段負責(zé)為類的靜態(tài)變量分配內(nèi)存,并設(shè)置默認初始值羽历。

解析

解析是虛擬機將常量池內(nèi)的符號引用替換為直接引用的過程焊虏。

初始化

初始化是類的加載的最后一步,會執(zhí)行類構(gòu)造器<clinit>()方法秕磷。

<clinit>()方法是由編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)語句塊中的語句合并產(chǎn)生的诵闭。

簡單點說初始化就是為類變量進行賦值和執(zhí)行靜態(tài)代碼塊

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澎嚣,一起剝皮案震驚了整個濱河市疏尿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌易桃,老刑警劉巖褥琐,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晤郑,居然都是意外死亡敌呈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門造寝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驱富,“玉大人,你說我怎么就攤上這事匹舞『峙福” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵赐稽,是天一觀的道長叫榕。 經(jīng)常有香客問我,道長姊舵,這世上最難降的妖魔是什么晰绎? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮括丁,結(jié)果婚禮上荞下,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好尖昏,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布仰税。 她就那樣靜靜地躺著,像睡著了一般抽诉。 火紅的嫁衣襯著肌膚如雪陨簇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天迹淌,我揣著相機與錄音河绽,去河邊找鬼。 笑死唉窃,一個胖子當(dāng)著我的面吹牛耙饰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纹份,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼苟跪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矮嫉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤牍疏,失蹤者是張志新(化名)和其女友劉穎蠢笋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳞陨,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡昨寞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了厦滤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片援岩。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掏导,靈堂內(nèi)的尸體忽然破棺而出享怀,到底是詐尸還是另有隱情,我是刑警寧澤趟咆,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布添瓷,位于F島的核電站,受9級特大地震影響值纱,放射性物質(zhì)發(fā)生泄漏鳞贷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一虐唠、第九天 我趴在偏房一處隱蔽的房頂上張望搀愧。 院中可真熱鬧,春花似錦、人聲如沸咱筛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眷蚓。三九已至鼻种,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沙热,已是汗流浹背叉钥。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篙贸,地道東北人投队。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像爵川,于是被迫代替她去往敵國和親敷鸦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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