Java虛擬機(jī)之類(lèi)加載器
- 作者:新網(wǎng)
- 來(lái)源:新網(wǎng)
- 瀏覽:100
- 2018-05-02 17:51:23
之前我們簡(jiǎn)單的介紹了一下關(guān)于Java類(lèi)的加載機(jī)制JAVA虛擬機(jī)之類(lèi)的前世今生——類(lèi)加載流程,現(xiàn)在我們?cè)傺a(bǔ)充介紹一下JVM進(jìn)行類(lèi)加載的類(lèi)加載器是如何使用的。
之前我們簡(jiǎn)單的介紹了一下關(guān)于Java類(lèi)的加載機(jī)制JAVA虛擬機(jī)之類(lèi)的前世今生——類(lèi)加載流程,現(xiàn)在我們?cè)傺a(bǔ)充介紹一下JVM進(jìn)行類(lèi)加載的類(lèi)加載器是如何使用的。

<
div> Java類(lèi)加載器的特點(diǎn)
類(lèi)加載器的作用是通過(guò)一個(gè)類(lèi)的全限定名來(lái)獲取描述此類(lèi)的二進(jìn)制字節(jié)流。通俗簡(jiǎn)單點(diǎn)可以理解為將類(lèi)的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中。同時(shí)要額外注意的是,類(lèi)加載器不光是用于類(lèi)的加載,同時(shí)也用于唯一確定一個(gè)類(lèi)。換而言之,同一個(gè)類(lèi)如果又不同的類(lèi)加載器加載,那么這兩個(gè)類(lèi)其實(shí)是不同的。
除此之外,我們還可以概括出類(lèi)加載器的3個(gè)特性。委托性,可見(jiàn)性和單一性。
委托性:當(dāng)一個(gè)類(lèi)加載器接收到了類(lèi)加載請(qǐng)求,它首先把這個(gè)請(qǐng)求委托給他的父類(lèi)加載器去完成,每個(gè)層次的類(lèi)加載器都是如此,因此所有的加載請(qǐng)求都會(huì)被傳送到頂層的啟動(dòng)類(lèi)加載器中,只有當(dāng)父加載器無(wú)法加載這個(gè)類(lèi)也即在該類(lèi)加載器的加載范圍內(nèi)無(wú)這個(gè)類(lèi)時(shí),子加載器才會(huì)嘗試自己去加載。
可見(jiàn)性:子類(lèi)的加載器可見(jiàn)父類(lèi)加載器加載的類(lèi),而父類(lèi)加載器看不到子類(lèi)加載器所加載的類(lèi)
單一性:一個(gè)類(lèi)只會(huì)被加載一次
常用類(lèi)加載器
從JVM的角度來(lái)看,只有兩種類(lèi)加載器,一種是由C++編寫(xiě)的啟動(dòng)類(lèi)加載器,其屬于虛擬機(jī)的一部分。一種是剩余其他所有類(lèi)加載器。從開(kāi)發(fā)人員的角度來(lái)看,又可以細(xì)分為4種類(lèi)加載器,啟動(dòng)類(lèi)加載器,擴(kuò)展類(lèi)加載器,應(yīng)用程序類(lèi)加載器,自定義類(lèi)加載器。
啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader):負(fù)責(zé)加載/lib目錄或-Xbootclasspath路徑下的并且是虛擬機(jī)識(shí)別的類(lèi)庫(kù)。且該類(lèi)加載器無(wú)法被Java程序直接引用。
擴(kuò)展類(lèi)加載器(Extension ClassLoader):負(fù)責(zé)加載/lib/ext或者
java.ext.dirs系統(tǒng)變量鎖指定的路徑下的類(lèi)庫(kù),可以被開(kāi)發(fā)者直接使用
應(yīng)用程序類(lèi)加載器(Application ClassLoader):負(fù)責(zé)加載ClassPath(用戶類(lèi)路徑)所指定的類(lèi)庫(kù),該類(lèi)加載器可以由getSystemClassLoader()方法獲得,所以也被稱(chēng)為系統(tǒng)類(lèi)加載器,開(kāi)發(fā)者同樣可以直接使用,一般情況下該類(lèi)加載器為程序中的默認(rèn)加載器。
以上就是虛擬機(jī)加載器的使用方式。