當前位置:首頁 > IT技術 > 其他 > 正文

幾種類加載器的使用體會
2022-05-11 11:08:42


類加載器的分類

  • JVM支持兩種類型的類加載器,分別為引導類加載器(Bootstrap ClassLoader)和自定義類加載器(User-Defined ClassLoader)。
  • 從概念上來講,自定義類加載器一般指的是程序中由開發(fā)人員自定義的一類類加載器,但是Java虛擬機規(guī)范卻沒有這么定義,而是將所有派生于抽象類ClassLoader的類加載器都劃分為自定義類加載器。
  • 無論類加載器的類型如何劃分,在程序中我們最常見的類加載器始終只有3個,如下圖所示:

幾種類加載器的使用體會_開發(fā)語言

代碼示例

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

//獲取其上層,擴展類加載器
ClassLoader extClassLoader = systemClassLoader.getParent();
System.out.println(extClassLoader); //sun.misc.Launcher$ExtClassLoader@1b6d3586

//獲取其上層
ClassLoader bootstrapClassLoader = extClassLoader.getParent();
System.out.println(bootstrapClassLoader); //null

//對于用戶自定義類來說:默認使用系統(tǒng)類加載器進行加載
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
System.out.println(classLoader); //sun.misc.Launcher$AppClassLoader@18b4aac2

//String類使用引導類加載器進行加載的。 ---> Java核心類庫都是使用引導類加載器進行加載的
ClassLoader classLoader1 = String.class.getClassLoader();
System.out.println(classLoader1); //null
}

}

幾種類加載器的使用體會_開發(fā)語言_02

虛擬機自帶的加載器?

  • 啟動類加載器(引導類加載器,Bootstrap ClassLoader)

幾種類加載器的使用體會_加載_03

  • 擴展類加載器

幾種類加載器的使用體會_自定義_04

  • 應用程序類加載器

幾種類加載器的使用體會_java_05

代碼示例

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());
}

//獲取擴展類加載器能夠加載類的路徑
System.out.println("************擴展類加載器************");
String extDirs = System.getProperty("java.ext.dirs");
System.out.println(extDirs);
}

}

幾種類加載器的使用體會_加載_06

用戶自定義類加載器

在Java的日常應用程序開發(fā)中,類的加載幾乎是由上節(jié)3種類加載器(引導、擴展和系統(tǒng)類加載器)相互配合執(zhí)行的,在必要時,我們還可以自定義類加載器,來定制類的加載方式。

為什么要自定義類加載器

  • 隔離加載類
  • 修改類加載的方式
  • 擴展加載源
  • 防止源碼泄漏

用戶自定義類加載器實現步驟

幾種類加載器的使用體會_java_07

關于ClassLoader

ClassLoader類,它是一個抽象類,其后所有的類加載器都繼承自ClassLoader(不包括啟動類加載器)

幾種類加載器的使用體會_自定義_08

獲取ClassLoader的幾種方?

幾種類加載器的使用體會_類加載器_09



本文摘自 :https://blog.51cto.com/u

開通會員,享受整站包年服務立即開通 >