一、載入
1.透過一個類別的全限定名稱來取得定義此類別的二進位位元組流。
2.將此位元組流所代表的靜態儲存結構轉換為方法區的執行時間資料結構。
3.在記憶體中產生一個代表這個類別的java.lang.Class對象,作為方法區這個類別的各種資料的存取入口。
二、驗證
1.檔案格式驗證
驗證位元組流是否符合Class檔案格式的規格,並且能被目前版本的虛擬機器處理。
2.元資料驗證
對位元組碼秒數的資訊進行語意分析,以確保其所描述的資訊符合java語言規格的要求。
3.位元組碼驗證
透過資料流與控制流程分析,決定程式語意是合法的、符合邏輯的。在第二輪對元資料資訊中的資料類型做完校驗後,這個階段將對類別的方法進行校驗分析,確保被校驗類別的方法在運行時不會做出危害虛擬機器安全的事件。
4.符號引用驗證
針對類別本身以外(常數池中的各種符號引用)的資訊進行匹配性校驗#,目的是確保解析動作能夠正常執行,如果無法透過符號引用驗證,將會拋出例外。
三、準備
正式為類別變數分配記憶體並設定類別變數初始值的階段,這些變數所使用的記憶體都會在方法區中分配。
這時候進行記憶體分配的只包含類別變數(被static修飾的變數),而不包括實例變量,實例變數會在物件實例化時隨物件一起分配到java堆中,還有對類別變數的初始化不是將類別變數賦值為最終的初始化值,而只是賦值為資料類型的零值。
例如public static int value=123;在準備階段只是將value賦值為int的零值,也就是0,而不是123(程式被編譯之後才會賦值123)
四、解析
解析階段是虛擬機器將常數池內的符號引用替換為直接引用的過程。
符號引用是可以是任意形式的字面量,根據不同的虛擬機器可能不同,但是他們都可以定位到目標,在class檔案中有定義。
直接引用是可以直接指向目標的指標、相對偏移量或一個能間接定位到目標的句柄。
五、初始化
到了初始化階段,才開始真正開始執行定義的java程式碼。在該階段,程式設計師透過程式製定的主觀計畫去初始化類別變數和其他資源。
真正的賦值在該階段進行,也就是準備階段的public static int value=123; 在該階段value現在將會被賦值為123
相關推薦:
以上是java--類別載入的過程的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!