本篇文章將介紹Java的類別載入機制的步驟,請看下列詳細內容。
類別載入機制
#類別從載入到虛擬機器記憶體開始,到卸載出記憶體為止,它的整個生命週期包括了:載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(using)、和卸載(Unloading)七個階段。其中驗證、準備和解析三個部分統稱為連接(Linking),這七個階段的發生順序如下圖所示:
類別載入的時機
主動引用:一個類別被主動引用之後會觸發初始化過程(加載,驗證,準備需要再此之前開始)
1)遇到new、getstatic、putstatic或invokestatic這4條字節碼指令時,如果類別沒有進行過初始化,則需要先觸發其初始化。產生這4個指令最常見的Java程式碼場景是:使用new關鍵字實例化物件時、讀取或設定一個類別的靜態欄位(被final修飾、已在編譯器把結果放入常數池的靜態欄位除外)時、以及呼叫一個類別的靜態方法的時候。
2)使用java.lang.reflect套件的方法對類別進行反射呼叫的時候,如果類別沒有進行過初始化,則需要先觸發其初始化。
3)當初始化一個類別的時候,如果發現其父類別還沒有進行過初始化,則需要觸發父類別的初始化。
4)當虛擬機器啟動時,使用者需要指定一個執行的主類別(包含main()方法的類別),虛擬機會先初始化這個類別。
5)當使用jdk7 的動態語言支援時,如果java.lang.invoke.MethodHandle實例最後的解析結果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,而這個方法句柄所對應的類別沒有進行過初始化,則需要先觸發器初始化。
被動引用:一個類別如果是被動引用的話,該類別不會觸發初始化過程
1)透過子類別引用父類別的靜態字段,不會導致子類別初始化。對於靜態字段,只有直接定義該字段的類別才會被初始化,因此當我們透過子類別來引用父類別中定義的靜態字段時,只會觸發父類別的初始化,而不會觸發子類別的初始化。
2)透過陣列定義來引用類,不會觸發此類的初始化。
3)常數在編譯階段會存入呼叫類別的常數池中,本質上沒有直接引用到定義常數的類,因此不會觸發定義常數的類別的初始化。
以上是java類別載入機制是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!