類加載機制

類的加載就是將class文件加載到虛擬機(內存)中,並進行驗證、準備、解析、初始化,形成JVM可使用的類

1.加載:①獲取定一個類的二進制字節流(可以是class文件,也可以jar文件,war文件等)。

              ②將字節流代表的靜態存儲結構轉化爲方法區運行時的數據結構。

              ③生成代表這個類的java.lang.Class對象,可以實現反射機制(由class獲取對象),一個類只能生成一個Class對象

2.驗證:確保字節流包含的信息符合當前VM的要求,class文件不一定是java編譯出來的,所以需要進行驗證

              ①文件格式驗證,驗證是否符合class文件的規定,如版本號等

              ②元數據驗證,對字節流描述的信息進行語義分析,保證符合語言規範

              ③字節碼驗證,通過數據流和控制流分析,確保語義符合法,符合邏輯

              ④符號引用驗證,發生在將符號引用轉化爲直接引用的時候,在解析階段完成,目的是檢查除類自身以外的信息進行匹配性校驗,比如引用的其他類是否存在,引用的類中的方法和字段是否存在,是否可訪問。

              驗證重要但不必要,如果代碼都被反覆驗證過,則可使用-Xverify:none關閉

3.準備:爲類變量(被static修飾)分配內存並初始化爲零值(final除外),在方法區分配。

4.解析:符號引用(字面值)替換爲直接引用

5.初始化:執行類構造器clinit,由編譯器生成,用來對類變量賦值和執行靜態代碼塊,若果沒有賦值且沒有靜態代碼塊,則沒有類構造器,不需要顯示調用,虛擬機保證父類先於子類執行。虛擬機保證clinit線程安全,且只執行一次。接口如有類變量賦值,則有clinit,但只在使用的時候執行。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章