【筆記】Java類加載過(guò)程

Java類加載過(guò)程

1. 加載(loading)

主要分為三個(gè)步驟:

  1. 通過(guò)一個(gè)類的全限定名來(lái)獲取定義此類的二進(jìn)制字節(jié)流。
  2. 將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。
  3. 在Java堆中生成一個(gè)代表這個(gè)列的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的訪問(wèn)入口。

2. 鏈接(linking)

2.1 驗(yàn)證(verification)

主要包括:

  1. 文件格式驗(yàn)證
  2. 元數(shù)據(jù)驗(yàn)證(語(yǔ)義校驗(yàn),保證符合Java語(yǔ)義規(guī)范)
  3. 字節(jié)碼驗(yàn)證
  4. 符號(hào)引用驗(yàn)證(檢查類,字段,方法是否存在,訪問(wèn)限制等等)

2.2 準(zhǔn)備(preparation)

為類的靜態(tài)變量分配內(nèi)存初始化。這些內(nèi)存在方法區(qū)分配,初始化的值“通常情況”下是數(shù)據(jù)類型的零值。假設(shè)一個(gè)類變量定義為:

public static int value = 123;

那么value將被初始化為0,上面的賦值操作將在<cinit>()方法中進(jìn)行。

假設(shè)一個(gè)類變量定義為(常量):

public static final int value = 123;

那么value將被初始化為123。

2.3 符號(hào)解析(resolution of Symbolic References)

一個(gè)Java類中通常會(huì)包含對(duì)其他類或接口的引用,解析過(guò)程就是確保這些被引用的類能被正確的找到。解析的過(guò)程可能會(huì)導(dǎo)致其他Java類被加載。被引用類的加載由引用類的類加載器執(zhí)行。

不同的JVM實(shí)現(xiàn)可能選擇不同的解析策略。一種做法是在鏈接的時(shí)候,就遞歸的把所有依賴的形式引用都進(jìn)行解析。而另外的做法則可能是只在一個(gè)形式引用真正需要的時(shí)候才進(jìn)行解析。

3. 初始化(initialization)

虛擬機(jī)規(guī)范嚴(yán)格規(guī)定有且只有四種情況必須對(duì)類進(jìn)行初始化:

  1. 遇到new,getstatic,putstatic,或invokestatic這4條字節(jié)碼指令的時(shí)候。

  2. 使用java.lang.reflect包的方法對(duì)類進(jìn)行反射調(diào)用的時(shí)候。

  3. 當(dāng)初始化一個(gè)類的時(shí)候,如果其父類還沒(méi)有進(jìn)行過(guò)初始化,則需要先觸發(fā)其父類的初始化。

  4. 虛擬機(jī)啟動(dòng)時(shí),用戶需要指定一個(gè)要執(zhí)行的類,虛擬機(jī)將初始化這個(gè)類。

初始化是執(zhí)行類構(gòu)造器<cinit>()的過(guò)程。

  • <cinit>()方法由靜態(tài)變量賦值操作和靜態(tài)語(yǔ)句塊合并而成,合成順序按照文件中出現(xiàn)的順序。編譯器執(zhí)行該操作。

  • 虛擬機(jī)保證初始化過(guò)程在多線程中被正確的加鎖和同步。

  • 虛擬機(jī)保證子類的<cinit>()執(zhí)行之前,父類的<cinit>()已經(jīng)執(zhí)行完畢。

  • 執(zhí)行接口的<cinit>()方法不需要先執(zhí)行父接口的<cinit>()方法,接口的實(shí)現(xiàn)類在初始化時(shí)也一樣不會(huì)先執(zhí)行接口的<cinit>()方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容