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