虛擬機(jī)類加載
- 作者:新網(wǎng)
- 來源:新網(wǎng)
- 瀏覽:100
- 2018-05-15 14:27:40
什么叫做類加載?虛擬機(jī)需要把類的數(shù)據(jù)從Class文件加載到內(nèi)存中,并對數(shù)據(jù)進(jìn)行校驗,轉(zhuǎn)換解析初始化。最終成為虛擬機(jī)認(rèn)識的java類型的過程就叫做類加載。
什么叫做類加載?虛擬機(jī)需要把類的數(shù)據(jù)從Class文件加載到內(nèi)存中,并對數(shù)據(jù)進(jìn)行校驗,轉(zhuǎn)換解析初始化。最終成為虛擬機(jī)認(rèn)識的java類型的過程就叫做類加載。
<
div> 類加載生命周期:類加載到虛擬機(jī)中到最后卸載:加載-驗證-準(zhǔn)備-解析-初始化-使用-卸載七個階段。
加載是類加載的第一個階段,虛擬機(jī)需要完成三件事。
1:通過類的全路徑獲取獲取定義此類的二進(jìn)制流。
2:把這個字節(jié)流的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)換為方法區(qū)的運行運行時數(shù)據(jù)結(jié)構(gòu)。
3:在內(nèi)存中生成一個代表這個類的java
.lang.Class對象。作為方法區(qū)訪問這個類數(shù)據(jù)結(jié)構(gòu)的入口
由于規(guī)范并沒有嚴(yán)格的要求所以實現(xiàn)的方式就更加靈活了。我們可以通過jar,ear,war包等格式中獲取也可以通過JSP生成class文件、反射等。
驗證:就是字面意思驗證class文件是否是安全的。
1、文件格式的驗證:是否魔數(shù)開頭,是否包含版本信息。當(dāng)前虛擬機(jī)是否支持當(dāng)前版本。常量池中的數(shù)據(jù)是否存在異常等
2、元數(shù)據(jù)驗證:主要針對類和類的屬性。驗證字節(jié)碼的語義是否正確,是否非法繼承等。
3、字節(jié)碼驗證:主要針對方法內(nèi)部:,驗證語義、邏輯等
4、符號引用驗證:驗證符號引用中全路徑能否找到對應(yīng)的類。指定類中是否包含使用的方法、字段。當(dāng)前調(diào)用方法是否允許調(diào)用等
準(zhǔn)備階段:分配類變量內(nèi)存(方法區(qū)),并初始化需要注意當(dāng)前初始化僅僅為static修飾的變量比如 public static int val = 2;
將被初始化:需要注意的是初始化的結(jié)果是0。但是也并不是任何情況都是變量的初始化。
解析過程就是上面提過的符號引用轉(zhuǎn)換為直接引用。解析過程中也許會觸發(fā)新的類加載。
類的初始化是類加載的最后一步。在準(zhǔn)備的階段變量已經(jīng)初始化過了系統(tǒng)默認(rèn)的值,單前階段則為程序中賦予的值。
提過虛擬機(jī)來看當(dāng)前階段執(zhí)行的為類構(gòu)造器();它是由編譯器自動收集類變量賦值動作和靜態(tài)語句塊中的語句合并產(chǎn)生的。收集的順序為源文件中出現(xiàn)的順序。靜態(tài)語句塊只能訪問到定義在靜態(tài)塊之前的變量。定義在之后的可以賦值,但是不可以訪問。
它不需要顯示的調(diào)用父類的構(gòu)造器。虛擬機(jī)會保證在子類之前執(zhí)行。