類加載器的分類
- JVM支持兩種類型的類加載器,分別為引導(dǎo)類加載器(Bootstrap ClassLoader)和自定義類加載器(User-Defined ClassLoader)。
- 從概念上來講,自定義類加載器一般指的是程序中由開發(fā)人員自定義的一類類加載器,但是Java虛擬機(jī)規(guī)范卻沒有這么定義,而是將所有派生于抽象類ClassLoader的類加載器都劃分為自定義類加載器。
- 無論類加載器的類型如何劃分,在程序中我們最常見的類加載器始終只有3個,如下圖所示:
代碼示例
package chapter01.com.wust.yq;
public class ClassLoaderTest {
public static void main(String[] args) {
//獲取系統(tǒng)類加載器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader); //sun.misc.Launcher$AppClassLoader@18b4aac2
//獲取其上層,擴(kuò)展類加載器
ClassLoader extClassLoader = systemClassLoader.getParent();
System.out.println(extClassLoader); //sun.misc.Launcher$ExtClassLoader@1b6d3586
//獲取其上層
ClassLoader bootstrapClassLoader = extClassLoader.getParent();
System.out.println(bootstrapClassLoader); //null
//對于用戶自定義類來說:默認(rèn)使用系統(tǒng)類加載器進(jìn)行加載
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
System.out.println(classLoader); //sun.misc.Launcher$AppClassLoader@18b4aac2
//String類使用引導(dǎo)類加載器進(jìn)行加載的。 ---> Java核心類庫都是使用引導(dǎo)類加載器進(jìn)行加載的
ClassLoader classLoader1 = String.class.getClassLoader();
System.out.println(classLoader1); //null
}
}
虛擬機(jī)自帶的加載器?
- 啟動類加載器(引導(dǎo)類加載器,Bootstrap ClassLoader)
- 擴(kuò)展類加載器
- 應(yīng)用程序類加載器
代碼示例
package chapter01.com.wust.yq;
import sun.misc.Launcher;
import java.net.URL;
public class ClassLoaderTest1 {
public static void main(String[] args) {
System.out.println("************啟動類加載器************");
//獲取BootstrapClassLoader能夠加載類的路徑
URL[] urLs = Launcher.getBootstrapClassPath().getURLs();
for (URL element : urLs) {
System.out.println(element.toExternalForm());
}
//獲取擴(kuò)展類加載器能夠加載類的路徑
System.out.println("************擴(kuò)展類加載器************");
String extDirs = System.getProperty("java.ext.dirs");
System.out.println(extDirs);
}
}
用戶自定義類加載器
在Java的日常應(yīng)用程序開發(fā)中,類的加載幾乎是由上節(jié)3種類加載器(引導(dǎo)、擴(kuò)展和系統(tǒng)類加載器)相互配合執(zhí)行的,在必要時,我們還可以自定義類加載器,來定制類的加載方式。
為什么要自定義類加載器
- 隔離加載類
- 修改類加載的方式
- 擴(kuò)展加載源
- 防止源碼泄漏
用戶自定義類加載器實(shí)現(xiàn)步驟
關(guān)于ClassLoader
ClassLoader類,它是一個抽象類,其后所有的類加載器都繼承自ClassLoader(不包括啟動類加載器)
獲取ClassLoader的幾種方?
本文摘自 :https://blog.51cto.com/u