Java類載入基本過程詳細介紹_java

來源:互聯網
上載者:User

Java類載入基本過程詳細介紹

基本過程:

  • 根據類的全限定名稱載入定義類的二進位位元組流。
  • 將位元組流代表的靜態儲存結構轉化為方法區的運行時資料結構
  • 記憶體中產生一個代表這個類的java.lang.Class對象,作為方法去這個類的各種資料訪問入口

 數組類本身不通過類載入器建立,由java虛擬機器直接建立,數組類的元素類型由類載入器載入。
數組類的元素類型:數組去掉所有維度後的類型, 

檔案格式驗證:

  1. 0xCAFEBABY 魔數開頭;
  2. 主次版本號碼當前虛擬機器可處理;
  3. 常量類型;
  4. 索引執行類型;
  5. utf8編碼資料類型,

中繼資料驗證:位元組碼描述資訊語義分析:

  1. 是否有父類;
  2. 父類是否繼承了final修飾的類;
  3. 非抽型類是否實現了父類或介面中需要實現的方法;
  4. 類中的欄位、方法的覆蓋,重載矛盾;

 位元組碼驗證:通過語義流及控制流程分析確定程式予以的合法性,正確性,方法體分析驗證。

  1. 符號引用驗證:虛擬機器將符號引用轉化為直接引用時候,解析階段,對類自身以外資訊進行匹配性驗證
  2. 符號引用中通過字元描述的全限定名是否能找到對應的類;
  3. 指定類中是否存在符合方法欄位的描述符,及簡單名稱所描述的方法和欄位;
  4. 符號引用中類,欄位,方法的訪問性。

準備:在方法區中為類變數分配記憶體及設定類變數初始值。

  1. 初始值通常為資料類型的零值,final修飾的值直接初始化為相應值。
  2. 類變數為static修飾的變數,區分於執行個體變數。

 解析:虛擬機器將常量池中的符號引用替換為直接引用過程

CONSTANT_Class_info,CONSTANT_Fieldref_info,CONSTANT_Methodref_info..

  1. 符號引用:以一組符號來描述所引用的目標,任何形式的字面量,只要使用時能無歧義的定位到目標,,與虛擬機器記憶體實現無關,無關引用目標是否載入。
  2. 直接引用:直接指向目標的指標,位移量或間接定位到目標的控制代碼,和虛擬機器實現的記憶體相關,直接引用相關的目標對象必須已載入。
  3. 。。。

初始化:開始執行類定義中的Java程式碼。執行類構造器<cinit>()方法,

<cinit>():

  1. 編譯器根據類檔案中定義順序自動收集類中的類變數的賦值動作和靜態語句塊兒的語句合并產生,靜態語句塊兒只能訪問到其前定義的變數。
  2. 區別於類的構造方法,不需要顯示的調用父類構造器,虛擬機器保證子類的<cinit>()執行之前父類的<cinit>()已經執行完成。
  3. 父類中的靜態語句塊兒執行於前。
  4. <cinit>()對於類或介面不是必須的,如果沒有變數賦值操作或靜態語句塊兒,則不產生。
  5. 介面的<cinit>()不需要先執行父介面的<cinit>(),同樣介面的實作類別<cinit>()也不需要。
  6. 安全執行緒:虛擬機器保證多線程環境中<cinit>()正確的加鎖,同步,同一時間只能有一個線程訪問初始化類的<cinit>()

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.