Java中類的加載過程

1 加載

   加載階段主要完成三件事,即通過一個類的全限定名來獲取定義此類的二進制字節流,將這個字節流所代表的靜態存儲結構轉化爲方法區的運行時數據結構,在Java堆中生成一個代表此類的Class對象,作爲訪問方法區這些數據的入口。這個加載過程主要就是靠類加載器實現的,這個過程可以由用戶自定義類的加載過程。

2  驗證

       這個階段目的在於確保Class文件的字節流中包含信息符合當前虛擬機要求,不會危害虛擬機自身安全。主要包括四種驗證:
         文件格式驗證:基於字節流驗證,驗證字節流是否符合Class文件格式的規範,並且能被當前虛擬機處理。
         元數據驗證:基於方法區的存儲結構驗證,對字節碼描述信息進行語義驗證。

       字節碼驗證:基於方法區的存儲結構驗證,進行數據流和控制流的驗證。  

         符號引用驗證:基於方法區的存儲結構驗證,發生在解析中,是否可以將符號引用成功解析爲直接引用。

3 準備

        僅僅爲類變量(即static修飾的字段變量)分配內存並且設置該類變量的初始值即零值,這裏不包含用final修飾的static,因爲final在編譯的時候就會分配了,同時這裏也不會爲實例變量分配初始化。類變量會分配在方法區中,而實例變量是會隨着對象一起分配到Java堆中。

4. 解析

    解析主要就是將常量池中的符號引用替換爲直接引用的過程。符號引用就是一組符號來描述目標,可以是任何字面量,而直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。有類或接口的解析,字段解析,類方法解析,接口方法解析。

5 初始化

    初始化階段依舊是初始化類變量和其他資源,這裏將執行用戶的static字段和靜態語句塊的賦值操作。這個過程就是執行類構造器方法的過程。
    方法是由編譯器收集類中所有類變量的賦值動作和靜態語句塊的語句生成的,類構造器方法與實例構造器方法不同,這裏面不用顯示的調用父類的方法,父類的方法會自動先執行於子類的方法。即父類定義的靜態語句塊和靜態字段都要優先子類的變量賦值操作。

#參考

    JAVA中類的加載過程

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