01-類加載過程

類加載過程

類加載可以分為加載蚁滋、連接冯事、初始化3個部分

加載

加載過程是指查找并加載類的二進(jìn)制數(shù)據(jù)焦匈,加載class文件的方式可以有以下幾種

  • 本地class文件
  • 網(wǎng)絡(luò)下載的class文件
  • jar或zip等歸檔文件中加載class文件
  • 將java源文件動態(tài)編譯的class文件(動態(tài)代理)
  • 特殊的數(shù)據(jù)庫中提取class文件

類加載的最終產(chǎn)品就是位于內(nèi)存中的Class對象。Class對象封裝了類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)并提供了能夠訪問方法區(qū)內(nèi)這些數(shù)據(jù)結(jié)構(gòu)的接口昵仅。

Java提供了兩種類加載器
Java虛擬機(jī)自帶的類加載器
  1. Bootstrap ClassLoader(由C++編寫)
  2. Extension ClassLoader(純Java的加載器)
  3. App/System ClassLoader(純Java的加載器)
用戶自定義的類加載器

1.java.lang.ClassLoader的子類

連接

連接就是對已經(jīng)讀入內(nèi)存的類的二進(jìn)制數(shù)據(jù)合并到虛擬機(jī)的運(yùn)行時環(huán)境中去缓熟,連接又分為3個步驟,分別是

  • 驗(yàn)證

    驗(yàn)證是對二進(jìn)制數(shù)據(jù)的合法性進(jìn)行校驗(yàn)摔笤,具體是指如下幾點(diǎn)

    • 類文件結(jié)構(gòu)檢查
    • 語義檢查
    • 字節(jié)碼驗(yàn)證
    • 兼容性驗(yàn)證
  • 準(zhǔn)備

    為類的靜態(tài)變量申請內(nèi)存够滑,并為其附上其類型的默認(rèn)值。(0吕世,false彰触,null等)

  • 解析

    在類型的常量池中尋找類、接口命辖、字段和方法的符號應(yīng)用轉(zhuǎn)換為直接應(yīng)用

初始化

初始化是指為類的靜態(tài)變量設(shè)置正確的初始值况毅,即在代碼中真正設(shè)置的值分蓖。

類初始化步驟:

  • 假如該類還未加載和連接,則先進(jìn)行加載和連接
  • 加入該類存在父類尔许,且父類還未被初始化時則先初始化父類
  • 初始化是按照代碼編寫順序依次執(zhí)行 的代碼么鹤。

類的初始化時機(jī)

類的初始化時機(jī)與類的使用方式密切相關(guān)

Java程序?qū)︻惖膬煞N使用方式
  • 主動使用
  • 被動使用

其中主動使用會引發(fā)上面的初始化操作。Java虛擬機(jī)要求每個類或接口在其被首次主動使用時才初始化類或接口味廊。

主動使用某個類或接口的七種情況
  1. 創(chuàng)建實(shí)例(new Object)
  2. 調(diào)用類的靜態(tài)方法
  3. 對類的靜態(tài)屬性get或set
  4. 反射(Class.forName蒸甜,需要注意的是在Class.forName時有一個initialize參數(shù)可以控制是否需要初始化,默認(rèn)為true余佛。)
  5. 初始化一個類的子類
  6. Java虛擬機(jī)啟動時被標(biāo)記為啟動類的類
  7. JDK1.7提供的對動態(tài)語言支持的三個句柄對應(yīng)的類沒初始化時

除了以上7種情況外的都是對類的被動使用柠新,被動使用是不會導(dǎo)致對類的初始化的。

另外訪問類的靜態(tài)屬性時有一種特殊情況不會造成類的主動使用衙熔,示例代碼如下

public class Sample{
  public static final int a = 1;
  public static final int b = new Random(3).nextInt(3);
}

public class Main {
  public static void main(String args[]){
    // 這里直接訪問Sample的靜態(tài)屬性a登颓,但并不會初始化Sample類,因?yàn)閷傩詀是final的红氯,因此在編譯期編譯器會將a的值放入Main類的常量池中框咙,在運(yùn)行時并不會去引用Sample類
    System.out.println(Sample.a);
    // 這里對Sample的靜態(tài)屬性b的直接訪問會造成Sample的初始化,因?yàn)殡m然b也是被final修飾的痢甘,但b的值需要在運(yùn)行時才能確定喇嘱,因此還是需要對Sample類進(jìn)行初始化操作
    System.out.println(Sample.b);
  }
}

調(diào)用ClassLoader的loadClass并不是對類的主動使用,因此不會進(jìn)行初始化塞栅。

接口的初始化時機(jī)

上文已經(jīng)說過者铜,當(dāng)Java虛擬機(jī)初始化一個類時,要求其所有父類都已經(jīng)被初始化放椰,但此規(guī)則并不適用于接口

針對接口來說遵循如下兩種規(guī)則

  • 在初始化一個類時并不會初始化其實(shí)現(xiàn)的接口
  • 在初始化一個字接口時并不會對其父接口進(jìn)行初始化

因此作烟,一個父接口并不會因?yàn)槠渥纸涌诨驅(qū)崿F(xiàn)類的初始化而初始化,只有當(dāng)程序首次主動使用特定接口的靜態(tài)變量時才會對其進(jìn)行初始化砾医。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拿撩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子如蚜,更是在濱河造成了極大的恐慌压恒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件错邦,死亡現(xiàn)場離奇詭異探赫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撬呢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門伦吠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事讨勤〖” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵潭千,是天一觀的道長谱姓。 經(jīng)常有香客問我,道長刨晴,這世上最難降的妖魔是什么屉来? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮狈癞,結(jié)果婚禮上茄靠,老公的妹妹穿的比我還像新娘。我一直安慰自己蝶桶,他們只是感情好慨绳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著真竖,像睡著了一般脐雪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恢共,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天战秋,我揣著相機(jī)與錄音,去河邊找鬼讨韭。 笑死脂信,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的透硝。 我是一名探鬼主播狰闪,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼濒生!你這毒婦竟也來了尝哆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤甜攀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琐馆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體规阀,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年瘦麸,在試婚紗的時候發(fā)現(xiàn)自己被綠了谁撼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖厉碟,靈堂內(nèi)的尸體忽然破棺而出喊巍,到底是詐尸還是另有隱情,我是刑警寧澤箍鼓,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布崭参,位于F島的核電站,受9級特大地震影響款咖,放射性物質(zhì)發(fā)生泄漏何暮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一铐殃、第九天 我趴在偏房一處隱蔽的房頂上張望海洼。 院中可真熱鬧,春花似錦富腊、人聲如沸坏逢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽是整。三九已至,卻和暖如春帘腹,著一層夾襖步出監(jiān)牢的瞬間贰盗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工阳欲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舵盈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓球化,卻偏偏與公主長得像秽晚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子筒愚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348