當程序主動使用某個類時,如果該類還未被加載到內存中,JVM會通過加載、連接、初始化3個步驟對該類進行類加載。
1. 加載:加載指的是將類的class文件讀入到內存中,并為之創建一個java.lang.Class對象。 類的加載由類加載器完成,類加載器由JVM提供,開發者也可以通過繼承ClassLoader基類來創建自己的類加載器。 通過使用不同的類加載器可以從不同來源加載類的二進制數據,通常有如下幾種來源:
- 從本地文件系統加載
- 從jar包加載
- 通過網絡加載,把一個Java源文件動態編譯,并執行加載
2. 連接 當類被加載之后,系統為之生成一個對應的Class對象,接著進入連接階段,連接階段負責將類的二進制數據合并到JRE中。類連接又可分為三個階段:
2.1 驗證
- 文件格式驗證
- 元數據驗證
- 字節碼驗證
- 符號引用驗證
2.2 準備 為類的靜態變量分配內存,并設置默認初始值。
2.3 解析 將類的二進制數據中的符號引用替換成直接引用。
3. 初始化為類的靜態變量賦予初始值。