1. 程式人生 > >深入拆解虛擬機器(三)Java虛擬機器是如何載入Java類的?

深入拆解虛擬機器(三)Java虛擬機器是如何載入Java類的?

引用型別

(1)類、介面、陣列類、泛型引數,由於泛型引數在編譯過程中被擦除,因此Java虛擬機器實際上只有前三種。

(2)在類、介面和陣列類中,陣列類是由Java虛擬機器直接生成的,其他兩種則有對應的位元組流。


載入

(1)載入,是指查詢位元組流。Java虛擬機器需要藉助類載入器完成查詢位元組流的過程。

(2)在Java9之前啟動類載入器負責載入最為基礎、最為重要的類,比如存放在JRE的lib目錄下的jar包(以及由虛擬機器引數-Xbootclasspath指定的類)。除了啟動類載入器之外,另外兩個重要的類載入器是擴充套件類載入器和應用類載入器,均由Java核心類庫提供。

(3)擴充套件類載入器的父類載入器是啟動類載入器。負責載入相對次要、但又通用的類,比如存放在JRE中的lib/ext目錄下jar包中的類。

(4)應用類載入器的父類是擴充套件類載入器,負責載入應用程式路徑下的類。預設情況下,應用程式中包含的類便是由應用類載入器載入的。


連結

(1)連結,是指將建立的類合併至Java虛擬機器中,使之能夠執行的過程。它分為驗證、準備以及解析三個階段

(2)驗證階段的目的,在於確保被載入類能夠滿足Java虛擬機器的約束條件

(3)準備階段的目的,則是為被載入的類的靜態欄位分配記憶體

(4)解析階段的目的。是將符號引用解析成實際引用


初始化

初始化,是為標記為常量的值的欄位賦值,以及執行 < clinit >方法的過程。類的初始化僅被執行一次,這個特性被用來實現單例的延遲初始化。