類加載器大的分類分為兩類(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ò)展類加載器)