類加載
- 在java 代碼中返劲,類型的加載病苗、連接與初始化過程都是在程序運(yùn)行期間完成的
- 提供了更大的靈活性惩嘉,增加了更多的可能性
類型的加載:
查找并加載類的二進(jìn)制數(shù)據(jù)
比如將已經(jīng)編寫好的.class文件浪耘。從磁盤上面加載到內(nèi)存里面
- 連接:
- 驗(yàn)證:確保被加載的類的正確性
- 準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存乱灵,并將其初始化為默認(rèn)值
- 解析:把類中的符號(hào)引用轉(zhuǎn)換為直接引用
- 初始化:為類的靜態(tài)變量賦予正確的初始值
初始化:
比如對(duì)于一些靜態(tài)遍量的賦值
類加載器深入剖析
- Java虛擬機(jī)與程序的生命周期
- 在如下幾種情況下,Java虛擬機(jī)將結(jié)束生命周期
- 執(zhí)行了System.exit()方法
- 程序正常執(zhí)行結(jié)束
- 程序在執(zhí)行過程中遇到了異称叱澹或錯(cuò)誤而異常終止
- 由于操作系統(tǒng)出現(xiàn)錯(cuò)誤而導(dǎo)致java虛擬機(jī)進(jìn)程終止(了解)
類的使用與卸載
- 使用
- 卸載(由Java虛擬機(jī)自帶的類加載器所加載的類痛倚,在虛擬機(jī)的生命周期中,始終不會(huì)被卸載澜躺。由用戶自定義的類加載器加載的類是可以被卸載的蝉稳。)
Java程序?qū)︻惖氖褂梅绞娇煞譃閮煞N
- 主動(dòng)使用(七種)
- 創(chuàng)建類的實(shí)例
- 訪問某個(gè)類或接口的靜態(tài)變量,或者對(duì)該靜態(tài)變量賦值(getstatic苗踪,putstatic)
- 調(diào)用類的靜態(tài)方法(invokestatic)
- 反射(如Class.forName("com.test.Test"))
- 初始化一個(gè)類的子類
- Java虛擬機(jī)啟動(dòng)時(shí)被標(biāo)明為啟動(dòng)類的類(Java.Test)
- JDK1.7開始提供的動(dòng)態(tài)語言的支持:
java.lang.invoke.MethidHandle實(shí)例的解析結(jié)果REF_getStatic,REF_putStatic,REF_invokeStatic句柄對(duì)應(yīng)的類沒有初始化颠区,則初始化(了解即可)
- 除了以上7種情況,其他使用Java類的方式都被看作是對(duì)類的被動(dòng)使用通铲,都不會(huì)導(dǎo)致類的初始化
- 被動(dòng)使用
- 所有的Java虛擬機(jī)實(shí)現(xiàn)必須在每個(gè)類或接口被Java程序“首次主動(dòng)使用”時(shí)才初始化他們
類的加載
- 類的加載指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi)器贩,然后在內(nèi)存中創(chuàng)建一個(gè)java.long.Class對(duì)象(規(guī)范并未說明Class對(duì)象位于哪里颅夺,HotSpot虛擬機(jī)將其放在了方法區(qū)中)用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)
- 加載.class文件的方式
- 從本地系統(tǒng)中直接加載
- 通過網(wǎng)絡(luò)下載.class文件
- 從zip,jar等歸檔文件中加載.class文件
- 從專有數(shù)據(jù)庫中提取.class文件(了解即可)
- 將Java源文件動(dòng)態(tài)編譯為.class文件
image.png