1. 程式人生 > >虛擬機類加載機制之類的加載過程

虛擬機類加載機制之類的加載過程

方式 命名 校驗 加載器 準備 計算 語言 直接 入口

引言

  類加載的全過程分為5個階段:加載,驗證,準備,解析,初始化。

加載

  加載階段虛擬機需要完成3件事:

  1)通過一個類的全限定名來獲取定義此類的二進制字節流,獲取方式很多種如Class文件、網絡、運行時計算生成等。

  2)將這個字節流代表的靜態存儲結構轉化為方法區的運行時數據結構。

  3)在內存中生成一個代表該類的java.lang.Class對象放在方法區,作為該類各種數據的訪問入口。

  一個非數組類的加載可以由引導類加載器完成也可以由用戶自定義的類加載器完成。對於數組類而言,數組本身不通過類加載器創建,是虛擬機直接完成。

  一個數組的創建遵循如下規則:

    如果數組的組件類型(去掉一個維度)為引用類型,遞歸加載該引用類型,數組將在加載該組件類型的類加載器的類命名空間上被標記。

    如果數組的組件類型不是引用類型(如int[]),虛擬機將會把數組與引導類加載器相關聯。

    數組的可見性與其組件的可見性一致,如果數組的組件類型不是引用類型(如int[])默認可見性為public。

驗證

  驗證是連接的第1步,作用是保證Class文件的字節流中包含的信息符合虛擬機的要求。

文件格式驗證

  驗證字節流信息是否符合Class文件格式規範。

  1)是否以魔數開頭。

  2)主次版本號是否在當前虛擬機處理範圍之內。

  3)常量池中的常量類型是否被支持(檢查常量tag標識)。

  。。。。。。

  只有通過了該階段的驗證,字節流才能進入方法區中進行存儲。該階段是針對字節流,後三個階段是針對方法區的存儲結構的。

元數據驗證

  對字節碼描述的信息進行語義分析,保證 其描述的信息符合Java語言規範。

  1)該類是否有父類(除Object其他類都應有)。

  2)該類父類是否繼承了不能被繼承的類(final修飾的類)。

  。。。。。。

字節碼驗證

  該階段是對方法體進行校驗分析,確保方法運行時不會危害虛擬機。

  1)保證任意時刻操作數棧的數據類型和指令代碼序列配合工作,如不允許在操作數棧放了一個int類型數據,運行時卻按long類型加載到局部變量表中。

虛擬機類加載機制之類的加載過程