首頁  >  文章  >  Java  >  Java類別載入過程的詳細介紹

Java類別載入過程的詳細介紹

不言
不言轉載
2019-03-07 16:49:523213瀏覽

這篇文章帶給大家的內容是關於Java類別載入過程的詳細介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

Java檔案從編碼到完成最終執行的過程:

  1. 編譯:Javac 把Java檔案編譯成.class檔案
  2. 執行:把.class檔案交給JVM運行

類別的載入過程

JVM虛擬機把.class檔案中類別資訊載入進內存,並進行解析產生對應的class物件的過程。 JVM不是一開始就把所有的類別都加載進記憶體中,而是只有第一次遇到某個需要運行的類別時才會加載,並且只加載一次。

Java類別載入過程的詳細介紹

載入

把class字節碼檔案從各個來源透過類別載入器載入到記憶體中
JVM要完成三件事

  1. 透過一個類別的全限定名稱來取得定義此類的二進位位元組流。
  2. 靜態儲存結構- > 方法區的執行時期資料結構
  3. 在Java堆中產生對應類別的java.lang.Class對象,作為方法區存取這些資料的存取入口。

類別載入器

  • 啟動類別載入器
  • 擴充類別載入器
  • 應用類別載入器
  • 自訂類別載入器

連線

將java類別的二進位程式碼合併到JVM的運行狀態之中的程序

驗證

保證載入的位元組流符合虛擬機器規範,不會造成安全錯誤

驗證分類

  • 檔案格式的驗證,例如常數中是否有不被支持的常數?文件中是否有不規範的或附加的其他資訊
  • 元資料的驗證,例如該類別是否繼承了被final修飾的類別?類別中的字段,方法是否與父類別衝突?是否出現了不合理的重載?
  • 字節碼的驗證,保證程式語意的合理性,例如要保證類型轉換的合理性。
  • 符號引用的驗證,例如校驗符號引用中透過全限定名稱是否能夠找到對應的類別?校驗符號引用中的存取性(private,public等)是否可被目前類別存取?

準備

為類別變數(注意,不是實例變數)分配內存,並且賦予初步值(Java虛擬機器根據不同變數類型的預設初始值)

預設初始值

  • 8種基本型別的初步值,預設為0
  • 引用型別的初步值則為null
  • 常數的初步值即程式碼中設定的值
  • final static tmp = 456

#解析

#常數池內的符號引用替換為直接引用的過程

#符號引用:一個字串,但是這個字串給了一些能夠唯一性識別一個方法,一個變量,一個類別的相關資訊

直接引用:可以理解為一個記憶體位址,或者一個偏移量

舉個例子來說,現在呼叫方法hello(),這個方法的位址是1234567,那麼hello就是符號引用,1234567就是直接引用

#解析階段,虛擬機會把所有的類別名,方法名,字段名這些符號引用替換為具體的記憶體位址或偏移量,也就是直接引用

初始化

對類別變數(static修飾的變數或語句)初始化,是執行類別建構器的過程

初始化過程

  • 初始化一個類別的時候,其父類別尚未初始化,則優先初始化其父類別
    - 同時包含多個靜態變數和靜態程式碼區塊,則依照自上而下的順序依序執行
#

以上是Java類別載入過程的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除