簡(jiǎn)述JVM基礎(chǔ)(五):虛擬機(jī)類(lèi)加載機(jī)制
- 作者:新網(wǎng)
- 來(lái)源:新網(wǎng)
- 瀏覽:100
- 2018-05-03 18:00:18
我們一定心里有個(gè)疑問(wèn),我們那個(gè)多態(tài)是怎么回事?我們指定的一個(gè)接口,卻可以等到運(yùn)行時(shí)可以對(duì)應(yīng)于不同的實(shí)現(xiàn)類(lèi)。所以,我們通過(guò)編譯器將我們寫(xiě)的Java文件代碼編譯成Class文件,程序跑起來(lái)的時(shí)候通過(guò)加載器。
<
div> 我們一定心里有個(gè)疑問(wèn),我們那個(gè)多態(tài)是怎么回事?我們指定的一個(gè)接口,卻可以等到運(yùn)行時(shí)可以對(duì)應(yīng)于不同的實(shí)現(xiàn)類(lèi)。所以,我們通過(guò)編譯器將我們寫(xiě)的Java文件代碼編譯成Class文件,程序跑起來(lái)的時(shí)候通過(guò)加載器。
加載過(guò)程
1、 加載(loading)
2、 連接
(1)、 驗(yàn)證
(2)、準(zhǔn)備:為類(lèi)變量分配內(nèi)存并設(shè)置初始值(如int為0)。
(3)、解析:
3、初始化
4、 使用
5、 卸載
類(lèi)加載器
1、唯一性
對(duì)于任何一個(gè)類(lèi),都需要和這個(gè)類(lèi)的加載器與這個(gè)類(lèi)共同確定在Java
虛擬機(jī)中的唯一性,這里說(shuō)的唯一性指的是"相等",也就是我們平時(shí)說(shuō)的Class對(duì)象的equals()、isAssiganableFrom()、isInstance()方法的返回結(jié)果;
2、雙親委派模型
當(dāng)一個(gè)類(lèi)的加載器收到了加載請(qǐng)求,不會(huì)自己先動(dòng)手,而是委派給這個(gè)類(lèi)的父類(lèi)進(jìn)行加載,如果找不到加載不了就反饋回來(lái)自己加載。這樣的話,讓Java的類(lèi)一出生就有了很好的層次父子關(guān)系。當(dāng)然也有一些手段去破壞這種關(guān)系而獲得某種效果。
雙親委派模型可以被破壞,推薦重寫(xiě)findClass()方法,而不是loadClass(),應(yīng)用于熱部署等技術(shù);
我們通過(guò)編譯器先將我們寫(xiě)的.
java代碼編譯為可執(zhí)行的.class文件,那么如果我們需要真正的執(zhí)行這個(gè)代碼,還需要一個(gè)過(guò)程。這個(gè)時(shí)候加載器的角色就來(lái)了,加載器將首先要加載可執(zhí)行文件,并變換數(shù)據(jù)結(jié)構(gòu)。在初始化之前,我們還需要進(jìn)行驗(yàn)證和準(zhǔn)備。解析的過(guò)程可以在初始化之前,也可以在初始化之后(實(shí)現(xiàn)動(dòng)態(tài)加載的時(shí)候-)。觸發(fā)初始化的條件有幾種,分為被動(dòng)引用和主動(dòng)引用兩大類(lèi)。我們可以理解為主動(dòng)引用是我們主動(dòng)的觸發(fā)了本Class的初始化,比如New 這個(gè)對(duì)象的實(shí)例。
但是,也存在我們?cè)诒绢?lèi)中引用到了其他的類(lèi),比如說(shuō)父類(lèi),其他類(lèi)的常量。如果,我們的操作不是上述的主動(dòng)引用,其結(jié)果是沒(méi)有觸發(fā)本Class的初始化,而是間接的觸發(fā)了別的Class進(jìn)行初始化工作。我們稱(chēng)這個(gè)為被動(dòng)引用。對(duì)于任何一個(gè)類(lèi),我們通過(guò)類(lèi)和這個(gè)類(lèi)的加載器共同確定在JVM中的唯一性,為了保證父類(lèi)和子類(lèi)的層次關(guān)系。我們?cè)谟行枨笥|發(fā)子類(lèi)的初始化時(shí),必須先完成父類(lèi)的初始化工作,一直向上追溯,從上到下依次完成初始化。這就是所謂的雙親委派模型。
雙親委派模型也是可以被破壞的,在熱部署技術(shù)中有應(yīng)用。