JVM(四)-類加載器

類加載器大的分類分為兩類(JAVA虛擬機(jī)規(guī)范):引導(dǎo)類加載器、自定義類加載器

引導(dǎo)類加載器(啟動(dòng)類加載器)

Bootstrap Class Loader,非JAVA語言編寫的,由C/C++語言實(shí)現(xiàn)。

系統(tǒng)的核心類庫,都是由引導(dǎo)類加載器加載的。比如jre/lib/rt.jar、resource.jar、sun.boot.class.path路徑下的內(nèi)容,用于提供JVM自身需要的類。

并不繼承自ClassLoader,沒有父類加載器。

加載擴(kuò)展類加載器和應(yīng)用程序類加載器,并為他們制定父類加載器。

處于安全考慮,引導(dǎo)類加載器只加載包名為java、javax、sun等開頭的類

在程序中無法獲取BootstrapClassLoader。

自定義加載器(繼承了ClassLoader類的加載器)

Extension Class Loader(擴(kuò)展類加載器)、System Class Loader(系統(tǒng)類加載器)、用戶自定義類加載器。均是由java語言實(shí)現(xiàn)的。

在程序中獲取到的ClassLoader均是繼承自自定義類加載器。

ClassLoader的類的關(guān)系:


擴(kuò)展類加載器(Extension ClassLoader)(虛擬機(jī)自帶的加載器)

java語言編寫,由sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn)

派生于ClassLoader類

父類為啟動(dòng)類加載器

從java.ext.dirs系統(tǒng)屬性所指定的目錄中加載類庫,或從JDK的安裝目錄jre/lib/ext子目錄(擴(kuò)展目錄)下加載類庫。如果用戶創(chuàng)建的JAR放在此目錄下也會(huì)自動(dòng)由擴(kuò)展類加載器加載。

應(yīng)用程序類加載器(系統(tǒng)類加載器,AppClassLoader)

java語言編寫,由sun.misc.Launcher$AppClassLoader實(shí)現(xiàn)

派生于ClassLoader類

父類為擴(kuò)展類加載器

負(fù)責(zé)加載環(huán)境變量ClassPath或系統(tǒng)屬性java.class.path制定路徑下的類庫

該類加載是程序中默認(rèn)的類加載器,一般來說,程序的類都是由此類加載器加載完成

可以通過ClassLoader#getSystemClassLoader()方法獲取到該類加載器

獲取ClassLoader的幾種方式:

1、clazz.getClassLoader方式:

ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();

(String類加載器為引導(dǎo)類加載器,此classLoader為null)

2、線程獲取當(dāng)前上下文的類加載器

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

(取決于當(dāng)前類所在的位置,一般為AppClassLoader)

3、獲取系統(tǒng)類加載器的父類

ClassLoader classLoader2 = ClassLoader.getSystemClassLoader().getParent();

(為擴(kuò)展類加載器)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容