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