日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM 学习三:类加载器

發布時間:2025/3/12 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM 学习三:类加载器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

類加載器

1 類加載器的分類

JVM 支持兩種類型的類加載器:引導類加載器(Bootstrap ClassLoader)自定義類加載器(User-Defined ClassLoader)

從概念上來講,自定義類加載器一般指的是程序中由開發人員自定義的一類加載器,但是 Java 虛擬機規范卻沒有這么定義,而是將所有派生于抽象類 ClassLoader 的類加載器都劃分為自定義類加載器

無論類加載器的類型如何劃分,在程序中我們最常見的類加載器始終只有 3 個,如下所示:

關于 ClassLoader:

測試代碼:ClassLoaderTest.java

public class ClassLoaderTest {public static void main(String[] args) {// 獲取系統(應用)類加載器ClassLoader systemLoader = ClassLoader.getSystemClassLoader();System.out.println(systemLoader); // sun.misc.Launcher$AppClassLoader@18b4aac2// 獲取 systemLoader 的上層:擴展類加載器ClassLoader extClassLoader = systemLoader.getParent();System.out.println(extClassLoader); // sun.misc.Launcher$ExtClassLoader@4554617c// 試圖獲取 extClassLoader 的上層 Bootstrap ClassLoder:獲取不到引導類加載器ClassLoader bootstrapLoader = extClassLoader.getParent();System.out.println(bootstrapLoader); // null// 用戶自定義類的類加載器:默認使用系統類加載器進行加載ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();System.out.println(classLoader); // sun.misc.Launcher$AppClassLoader@18b4aac2// String 的類加載器也是引導類加載器 --> Java 的核心類庫都是使用引導類加載器進行加載的ClassLoader classLoader2 = String.class.getClassLoader();System.out.println(classLoader2); // null} }

2 虛擬機自帶的加載器

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

  • 這個類加載器使用 C/C++ 語言實現的,嵌套在 JVM 內部
  • 它用來加載 Java 的核心庫(JAVA_HOME/jre/lib/rt.jar、resources.jar 或 sun.boot.class.path 路徑下的內容),用于提供 JVM 自身需要的類
  • 并不繼承自 java.lang.ClassLoader,沒有父加載器
  • 加載擴展類應用程序類加載器,并指定為它們的父類加載器
  • 出于安全考慮,Bootstrap ClassLoader 啟動類加載器只加載包名為 java、javax、sun 開頭的類

測試類 ClassLoaderTest2.java

public class ClassLoaderTest2 {public static void main(String[] args) {System.out.println("======== 啟動類加載器 ========");// 獲取 BootstrapClassLoader 能夠加載的 API 路徑URL[] urLs = Launcher.getBootstrapClassPath().getURLs();for (URL urL : urLs) {System.out.println(urL.toExternalForm());}// 驗證 jsse.jar 包下 Provider 類的類加載器為 Bootstrap ClassLoaderSystem.out.println(Provider.class.getClassLoader()); // null} }

Provider 類由引導類加載器加載:

輸出結果:

2.2 擴展類加載器(Extension ClassLoader)

  • Java 語言編寫的,由 sun.misc.Launcher$ExtClassLoader 實現
  • 派生于 ClassLoader
  • 父類加載器為啟動類加載器
  • 從 java.ext.dirs 系統屬性所指定的目錄中加載類庫,或從 JDK 的安裝目錄的 jre/lib/ext 子目錄(擴展目錄)下加載類庫。如果用戶創建的 JAR 放在此目錄下,也會自動由擴展類加載器加載

測試類 ClassLoaderTest3.class

public class ClassLoaderTest3 {public static void main(String[] args) {System.out.println("======= 擴展類加載器 =======");String extDirs = System.getProperty("java.ext.dirs");for (String path : extDirs.split(";")) {System.out.println(path);}// 驗證 CurveDB 是由 ExtClassLoader 加載器所加載的System.out.println(CurveDB.class.getClassLoader()); // sun.misc.Launcher$ExtClassLoader@7ea987ac} }

CurveDB 類是由 ExtClassLoader 加載器所加載的

輸出結果:

2.3 應用程序類加載器(系統類加載器,AppClassLoader)

  • Java 語言編寫,由 sun.misc.Launcher$AppClassLoader 實現
  • 派生于 ClassLoader
  • 父類加載器為擴展類加載器
  • 它負責加載環境變量 classpath 或系統屬性 java.class.path 指定路徑下的類庫
  • 應用程序類加載器程序中默認的類加載器,一般來說,Java 應用的類都是由它來完成加載
  • 通過 ClassLoader#getSystemClassLoader() 方法可以獲取到該類加載器

測試類 ClassLoaderTest.java

public class ClassLoaderTest4 {public static void main(String[] args) {// 獲取用戶自定義類的類加載器System.out.println(ClassLoaderTest4.class.getClassLoader());/*** 輸出結果為:sun.misc.Launcher$AppClassLoader@18b4aac2*/} }

3 用戶自定義類加載器

在 Java 的日常應用程序開發中,類的加載幾乎都是同上述 3 種類加載器相互配合完成的,但是在必要的時候,我們也可以自定義類加載器,來定制類的加載方式。

3.1 為什么要自定義類加載器

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

3.2 自定義類加載器實現步驟

  • 開發人員可以通過繼承抽象類 java.lang.ClassLoader 類的方式,實現自己的類加載器,以滿足一些特殊的需求
  • 在 JDK 1.2 之前,自定義類加載器時,總會去繼承 ClassLoader 類并重寫 loadClass() 方法,從而實現自定義的加載器類,但是在 JDK 1.2 之后已不再建議用戶覆蓋 loadClass() 方法,而是建議把自定義類加載的邏輯寫在 findClass() 方法中
  • 在編寫自定義類加載器時,如果沒有太過于復雜的需求,可以直接繼承 URLClassLoader類,這樣就可以避免自己去編寫 findClass() 方法及其獲取字節碼流的方式,使自定義類加載器編寫更加簡潔
  • 簡單的類加載器實現 CustomClassLoader.java

    public class CustomClassLoader extends ClassLoader {@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {try {byte[] result = getClassFromCustomPath(name);if (result == null) {throw new FileNotFoundException();} else {return defineClass(name, result, 0, result.length);}} catch (FileNotFoundException e) {e.printStackTrace();}throw new ClassNotFoundException(name);}private byte[] getClassFromCustomPath(String name) {// 從自定義路徑中加載指定類:細節略// 如果指定路徑的字節碼文件進行了加密,則需要在此方法中進行解密操作return null;}public static void main(String[] args) {CustomClassLoader customClassLoader = new CustomClassLoader();try {Class<?> clazz = Class.forName("One", true, customClassLoader);Object obj = clazz.newInstance();System.out.println(obj.getClass().getClassLoader());} catch (Exception e) {e.printStackTrace();}} }

    4 關于 ClassLoader

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

    4.1 方法介紹

    方法名稱描述
    getParent()返回該類加載器的超類加載器
    loadClass(String name)加載名稱為 name 的類,返回結果為 java.lang.Class 類的實例
    findClass(String name)查找名為 name 的類,返回結果為 java.lang.Class 類的實例
    findLoadedClass(String name)查找名為 name 的已經被加載過的類,返回結果為 java.lang.Class 的類的實例
    defineClass(String name, byte[] b, int off, int len)把字節數組 b 中的內容轉換為一個 Java 類,返回結果為 java.lang.Class 類的實例
    resolveClass(Class<?> c)連接指定的一個 Java 類

    4.2 獲取 ClassLoader 的途徑

    • 獲取當前類的 ClassLoader: clazz.getClassLoader()
    • 獲取當前線程上下文的 ClassLoader: Thread.currentThread().getContextClassLoader()
    • 獲取系統的 ClassLoader: ClassLoader.getSystemClassLoader()
    • 獲取調用都的 ClassLoader: DriverManager.getCallerClassLoader()

    總結

    以上是生活随笔為你收集整理的JVM 学习三:类加载器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美一区二区三区久久综合 | 国产成人精品一区二区三区无码熬 | 伊人影院在线视频 | 成人精品一区二区三区电影 | 久久久久久久久久久91 | 美女扒开尿口给男人捅 | 欧美日韩一区二区在线 | 亚洲欧美另类在线视频 | 啄木乌欧美一区二区三区 | 成人理论片 | 九九热精品免费视频 | wwwxx国产| 亚洲a一区二区 | а√天堂资源在线 | 少妇高潮av久久久久久 | 深爱激情av | 天天爽天天爽夜夜爽毛片 | 成人福利院 | 游戏涩涩免费网站 | 午夜在线小视频 | jzzijzzij亚洲成熟少妇 | 亚洲人在线 | 欧美成人三级在线观看 | 特级av片 | 免费小视频 | 阿v视频免费在线观看 | 神马影院一区二区 | 亚洲理论片在线观看 | 国产夫妻在线视频 | 亚洲作爱 | 国产成人自拍视频在线观看 | 亚洲欧美自拍偷拍 | 天天草天天草 | 成人午夜一区 | 手机看片日韩福利 | 日韩av免费 | 秋霞网一区二区三区 | 亚洲孕交 | 污片在线免费观看 | 国产成人高清视频 | 欧美亚洲少妇 | 在线a毛片 | 亚洲国产欧美另类 | 国产无码精品在线观看 | 国产成人午夜精品无码区久久 | 91视频看看 | 91中文视频 | 成片免费观看视频大全 | 手机av免费在线观看 | 成人免费视频国产免费网站 | 国产精品视频久久久久 | 亚洲欧美国产精品专区久久 | 亚洲精品一区在线观看 | 鲁鲁在线| 国产又爽又黄又嫩又猛又粗 | 玖玖国产精品视频 | 88av.com| 伊人婷婷久久 | 黄色一级片在线 | 日本高清免费视频 | 精品国产伦一区 | 欧美另类一区二区 | 久久午夜激情 | 久久久久激情 | 四虎视频国产精品免费 | 男女视频在线观看免费 | 这里只有精品在线观看 | 欧美色图国产精品 | 日本精品网站 | 亚洲国产午夜 | 毛片看看 | 国产欧美一区二区三区在线老狼 | 91精品国产欧美一区二区成人 | 一区二区国产欧美 | 先锋影音av在线 | 亚洲精品乱码久久久久久 | 欧美综合一区二区三区 | 青青草草视频 | 奇米影视亚洲春色 | 成人免费激情视频 | 丝袜制服中文字幕 | 国产免费又爽又色又粗视频 | 国产一区二区av | 黄视频免费在线看 | 久热中文字幕在线 | 一区二区视频观看 | 情欲少妇人妻100篇 黄色一级片欧美 | 国产96视频 | 精品国产一区二区三区四区 | 超碰极品 | 精品国产一区二区三区四区精华 | 日本打屁股网站 | 一个人免费在线观看视频 | 国产伦精品一区二区三区免.费 | 成人xxxx | 日韩av有码 | 国产成人毛毛毛片 | 农村老熟妇乱子伦视频 | 华人色 |