类java的步骤_java类加载的过程
類加載就是三個過程:加載、鏈接、初始化
鏈接又可以分為驗證、準備、解析
1.加載
將class字節碼文件通過類加載器裝入內存中
2.驗證
確保當前class文件的字節流所包含的內容符合當前JVM的規范要求,并且不會出現危害JVM自身安全的代碼,當前字節流不符合規范會拋出VerifyError的異常,或者子異常,驗證的信息有:
(1)文件格式:驗證二進制文件是什么類型,驗證是否符合當前JVM規范,
(2)元數據驗證:檢查類是否有父類、接口,驗證其父類、接口的合法性,驗證被final修飾的類, ?驗證是否是抽象類,是否實現了父類的抽象方法或者接口中的方法, ? 驗證方法的重載。
(3)字節碼驗證,主要驗證程序的控制流程比如循環、分支等,
(4)符號驗證,主要驗證符號引用轉換為直接引用時的合法性
3.準備
為靜態變量分配內存和初始值
各種數據類型的初始值如下:
如果是final修飾的靜態變量,那么會直接進行計算 ,不會進行初始化
private static int aa = 10;//(1)
private static final int bb = 10;//(2)
在(1)的位置? static int aa = 10在準備階段中不是10,而是初始值0,而
(2)static final int bb= 10會是10,因為final修飾的靜態變量不會導致類的初始化,可以直接計算出結果。
4.解析
當通過準備階段之后,進入解析階段。解析階段是虛擬機將常量池內的符號引用替換為直接引用的過程,解析動作主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調用點限定符7類符號引用進行。符號引用就是一組符號來描述目標,可以是任何字面量。
直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。
5.初始化
是類加載過程的最后一步,會開始真正執行類中定義的Java代碼。而之前的類加載過程中,除了在『加載』階段用戶應用程序可通過自定義類加載器參與之外,其余階段均由虛擬機主導和控制
與『準備』階段的區分:
準備階段:變量賦初始零值
初始化階段:根據Java程序的設定去初始化類變量和其他資源,或者說是執行類構造器clinit的過程
clinit:由編譯器自動收集類中的所有類變量(靜態變量)的賦值動作和靜態語句塊static{}中的語句合并產生
特點:
1.是線程安全的,在多線程環境中被正確地加鎖、同步
2.對于類或接口來說是非必需的,如果一個類中沒有靜態語句塊,也沒有對變量的賦值操作,那么編譯器可以不為這個類生成 clinit
3.接口與類不同的是,執行接口的 clinit不需要先執行父接口的 clinit,只有當父接口中定義的變量使用時,父接口才會初始化。另外,接口的實現類在初始化時也一樣不會執行接口的clinit
Java程序對類的使用方式可分為兩種:主動使用與被動使用。一般來說只有當對類的首次主動使用的時候才會導致類的初始化,所以主動使用又叫做類加載過程中“初始化”開始的時機。那啥是主動使用呢?類的主動使用包括以下幾種【超級重點】:
1.遇到new、getstatic、putstatic或invokestatic這4條字節碼指令
2使用java.lang.reflect包的方法對類進行反射調用的時候
3.當初始化一個類的時候,若發現其父類還未進行初始化,需先觸發其父類的初始化
4.在虛擬機啟動時,需指定一個要執行的主類,虛擬機會先初始化它
5.當使用JDK1.7的動態語言支持時,若一個java.lang.invoke.MethodHandle實例最后的解析結果為REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,且這個方法句柄所對應的類未進行初始化,需先觸發其初始化。
類的生命周期,加載過程完后多了使用、卸載
使用:
當 JVM 完成初始化階段之后,JVM 便開始從入口方法開始執行用戶的程序代碼。這個使用階段也只是了解一下就可以了。
卸載:
當用戶程序代碼執行完畢后,JVM 便開始銷毀創建的 Class 對象,最后負責運行的 JVM 也退出內存。這個卸載階段也只是了解一下就可以了。
類加載器
雙親委派機制
工作過程:若一個類加載器收到了類加載的請求,它先會把這個請求委派給父類加載器,并向上傳遞,最終請求都傳送到頂層的啟動類加載器中。只有當父加載器反饋自己無法完成這個加載請求時,子加載器才會嘗試自己去加載
優點:類會隨著它的類加載器一起具備帶有優先級的層次關系,可保證Java程序的穩定運作;實現簡單,所有實現代碼都集中在java.lang.ClassLoader的loadClass()中
總結
以上是生活随笔為你收集整理的类java的步骤_java类加载的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7电脑上的文件打开方式选错了怎么办
- 下一篇: java pair class,在Jav