類加載概念初識

整體概覽

類加載

  • 在Java代碼中谢揪,類型的加載、連接阎姥、初始化過程都是在程序運行期間完成的
  • 提供了更大的靈活性记舆,增加了更多的可能性

類的加載、連接與初始化

  • 加載:查找并加載類的二進制數(shù)據(jù)

  • 連接

    • 驗證:確保被加載類的正確性
    • 準備:為類的靜態(tài)變量分配內(nèi)存呼巴,并將其初始化為默認值
    • 解析:把類中的符號引用轉(zhuǎn)換為直接引用
  • 初始化:為類的靜態(tài)變量賦予正確的初始值

類的加載

  • 類的加載指的是將類的.class文件中的二進制數(shù)據(jù)讀入到內(nèi)存中泽腮,將其放在運行時數(shù)據(jù)區(qū)的方法區(qū)內(nèi),然后在內(nèi)存中創(chuàng)建一個java.lang.Class對象(規(guī)范并未說明Class對象位于哪里衣赶,HotSpot虛擬機將其放在了方法區(qū)中)用來封裝類的方法區(qū)內(nèi)的數(shù)據(jù)
  • 加載class文件的方式
    1. 從本地系統(tǒng)中直接加載
    2. 通過網(wǎng)絡下載.class文件
    3. 從zip诊赊,jar等歸檔文件中加載.class文件
    4. 從專有數(shù)據(jù)庫中提取出.class文件
    5. 將Java源文件動態(tài)編譯為.class文件
  • 類的加載的最終產(chǎn)品是位于內(nèi)存中的Class對象
  • 類加載器不需要等到某個類被“首次主動使用”時再加載它,JVM規(guī)范允許類加載器在預料某個類將要被使用時預先加載它府瞄,如果與先加載過程中遇到了.class文件缺失或存在錯誤碧磅,類加載器必須在程序首次主動使用該類時才報告錯誤
  • 如果這個類一直沒被程序主動使用,那類加載器就不會報告錯誤

類的連接

  • 將已經(jīng)讀入到內(nèi)存的類的二進制數(shù)據(jù)合并到虛擬機的運行時環(huán)境中去
  • 將類與類之間的關系確定好遵馆,并且對字節(jié)碼相關的處理鲸郊、驗證、校驗等操作通過加載連接完成

驗證

  • 類文件的結(jié)構檢查
  • 語義檢查
  • 字節(jié)碼驗證
  • 二進制兼容性的驗證

準備

  • 準備階段货邓,Java虛擬機為類的靜態(tài)變量分配內(nèi)存秆撮,并設置默認的初始值。例如以下示例逻恐,在準備階段將為int類型的靜態(tài)變量a分配4個字節(jié)的內(nèi)存空間像吻,并且賦予默認值0,為long類型的靜態(tài)變量b分配8個字節(jié)的內(nèi)存空間复隆,并且賦予默認值0.
public class Sample{
    private static int a = 1;
    public static long  b;
    static {
        b = 2;
    }
}

類的初始化

初始化途徑

  • 在初始化階段拨匆,Java虛擬機執(zhí)行類的初始化語句,為類的靜態(tài)變量賦予初始值挽拂。在程序中惭每,靜態(tài)變量的初始化有兩種途徑:
    1. 在靜態(tài)變量的聲明處進行初始化
    2. 在靜態(tài)代碼塊中進行初始化
  • Java虛擬機按照初始化語句的類文件的先后順序依次執(zhí)行它們

例如以下代碼,靜態(tài)變量a和b都被顯式初始化亏栈,而靜態(tài)變量c沒有被顯式初始化台腥,它將保持默認值0,按照先后順序a最終將取值為4

public class Sample{
    private static int a = 1;
    public static long  b;
    public static long  c;
    static {
        b = 2;
    }
    static {
        a = 4;
    }
}

初始化時機

所有的Java虛擬機實現(xiàn)必須在每個類或接口被Java程序“首次主動使用”時才初始化他們

  • 主動使用(七種)

    1. 創(chuàng)建類的實例
    2. 訪問某個類或接口的靜態(tài)變量绒北,或者對該靜態(tài)變量賦值
    3. 調(diào)用類的靜態(tài)方法
    4. 反射(如Class.forName("com.test.Test"))
    5. 初始化一個類的子類
    6. Java虛擬機啟動時被表明為啟動類的類(Java Test)
    7. JDK1.7開始提供的動態(tài)語言支持:java.lang.invoke.MethodHandle實例的解析結(jié)果REF_getStatic,REF_putStatic,REF_invokeStatic句柄對應的類沒有初始化黎侈,則初始化

    除了以上七中情況,其他使用Java類的方式都被看作是對類的被動使用闷游,都不會導致類的初始化


參考資料:
圣思園JVM課程

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峻汉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脐往,更是在濱河造成了極大的恐慌休吠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件业簿,死亡現(xiàn)場離奇詭異瘤礁,居然都是意外死亡,警方通過查閱死者的電腦和手機梅尤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門柜思,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人克饶,你說我怎么就攤上這事酝蜒。” “怎么了矾湃?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵亡脑,是天一觀的道長。 經(jīng)常有香客問我邀跃,道長霉咨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任拍屑,我火速辦了婚禮途戒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僵驰。我一直安慰自己喷斋,他們只是感情好唁毒,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著星爪,像睡著了一般浆西。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顽腾,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天近零,我揣著相機與錄音,去河邊找鬼抄肖。 笑死久信,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的漓摩。 我是一名探鬼主播裙士,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼管毙!你這毒婦竟也來了潮售?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤锅风,失蹤者是張志新(化名)和其女友劉穎酥诽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皱埠,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡肮帐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了边器。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片训枢。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖忘巧,靈堂內(nèi)的尸體忽然破棺而出恒界,到底是詐尸還是另有隱情,我是刑警寧澤砚嘴,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布十酣,位于F島的核電站,受9級特大地震影響际长,放射性物質(zhì)發(fā)生泄漏耸采。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一工育、第九天 我趴在偏房一處隱蔽的房頂上張望虾宇。 院中可真熱鬧,春花似錦如绸、人聲如沸嘱朽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搪泳。三九已至骑篙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間森书,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工谎势, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凛膏,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓脏榆,卻偏偏與公主長得像猖毫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子须喂,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353