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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加载路径 及父委托机制

發布時間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加载路径 及父委托机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/irelandken/article/details/7048817

分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加載路徑及"父委托機制"
[java] view plaincopyprint?
  • import?java.net.URL;??
  • import?java.net.URLClassLoader;??
  • ??
  • /*?
  • 分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加載路徑?
  • *?
  • */??
  • ??
  • public?class?ClassPath_of_Bootstrap_Ext_AppClassLoader??
  • {??
  • ????public?static?void?main(String[]?args)??
  • ????{??
  • ????????System.out.println("BootstrapClassLoader?的加載路徑:?");??
  • ??????????
  • ????????URL[]?urls?=?sun.misc.Launcher.getBootstrapClassPath().getURLs();??
  • ????????for(URL?url?:?urls)??
  • ????????????System.out.println(url);??
  • ????????System.out.println("----------------------------");??
  • ??????????????????
  • ????????//取得擴展類加載器 ??
  • ????????URLClassLoader?extClassLoader?=?(URLClassLoader)ClassLoader.getSystemClassLoader().getParent();??
  • ??
  • ????????System.out.println(extClassLoader);??
  • ????????System.out.println("擴展類加載器?的加載路徑:?");??
  • ??????????
  • ????????urls?=?extClassLoader.getURLs();??
  • ????????for(URL?url?:?urls)??
  • ????????????System.out.println(url);??
  • ??????????
  • ????????System.out.println("----------------------------");??
  • ??????????????????
  • ??????????
  • ????????//取得應用(系統)類加載器 ??
  • ????????URLClassLoader?appClassLoader?=?(URLClassLoader)ClassLoader.getSystemClassLoader();??
  • ??????????
  • ????????System.out.println(appClassLoader);??
  • ????????System.out.println("應用(系統)類加載器?的加載路徑:?");??
  • ??????????
  • ????????urls?=?appClassLoader.getURLs();??
  • ????????for(URL?url?:?urls)??
  • ????????????System.out.println(url);??
  • ??????????????????
  • ????????System.out.println("----------------------------");???
  • ????}??
  • }??
  • import java.net.URL; import java.net.URLClassLoader;/* 分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加載路徑 * */public class ClassPath_of_Bootstrap_Ext_AppClassLoader {public static void main(String[] args){System.out.println("BootstrapClassLoader 的加載路徑: ");URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();for(URL url : urls)System.out.println(url);System.out.println("----------------------------");//取得擴展類加載器URLClassLoader extClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader().getParent();System.out.println(extClassLoader);System.out.println("擴展類加載器 的加載路徑: ");urls = extClassLoader.getURLs();for(URL url : urls)System.out.println(url);System.out.println("----------------------------");//取得應用(系統)類加載器URLClassLoader appClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();System.out.println(appClassLoader);System.out.println("應用(系統)類加載器 的加載路徑: ");urls = appClassLoader.getURLs();for(URL url : urls)System.out.println(url);System.out.println("----------------------------"); } }
    運行時輸出如下:

    BootstrapClassLoader 的加載路徑:?
    file:/C:/jdk1.7.0_01/jre/lib/resources.jar
    file:/C:/jdk1.7.0_01/jre/lib/rt.jar
    file:/C:/jdk1.7.0_01/jre/lib/sunrsasign.jar
    file:/C:/jdk1.7.0_01/jre/lib/jsse.jar
    file:/C:/jdk1.7.0_01/jre/lib/jce.jar
    file:/C:/jdk1.7.0_01/jre/lib/charsets.jar
    file:/C:/jdk1.7.0_01/jre/classes
    ----------------------------
    sun.misc.Launcher$ExtClassLoader@3e389405
    擴展類加載器 的加載路徑:?
    file:/C:/jdk1.7.0_01/jre/lib/ext/dnsns.jar
    file:/C:/jdk1.7.0_01/jre/lib/ext/localedata.jar
    file:/C:/jdk1.7.0_01/jre/lib/ext/sunec.jar
    file:/C:/jdk1.7.0_01/jre/lib/ext/sunjce_provider.jar
    file:/C:/jdk1.7.0_01/jre/lib/ext/sunmscapi.jar
    file:/C:/jdk1.7.0_01/jre/lib/ext/zipfs.jar
    ----------------------------
    sun.misc.Launcher$AppClassLoader@a200d0c
    應用(系統)類加載器 的加載路徑:?
    file:/E:/JAVA/JVM_Class_Reflect_Thread/ClassPath_of_Bootstrap_Ext_AppClassLoader/bin/
    ----------------------------


    現在我們就知道了這三個類加載器的加載路徑了:
    • BootstrapClassLoader ? ? ? ? ? ? ? ? ?---加載jre/目錄下的核心庫

    • ExtClassLoader擴展類加載器 ? ? ? ? ? ? ?---加載/jre/lib/ext/目錄下的擴展包

    • AppClassLoader應用(系統)類加載器 ? ? ? ?---加載CLASSPATH路徑下的包





    JDK源代碼中,protected Class<?> loadClass(String name, boolean resolve)?方法?

    已經很好地體現出"父親委托機制":

    ? ??

    1:先調用parent.loadClass(name, false)

    ? ??

    2:如果父親加載失敗,則調用?loadClass(name, false)?方法 查找"當前類加載器"對應的"目錄"來加載

    ? ? ?

    public Class<?>loadClass(String?name,?boolean resolve)

    此方法的默認實現將按以下順序搜索類:

    ? ??

    1.調用?findLoadedClass(name)?來檢查是否已經加載類。

    ? ?

    2.在父類加載器上調用 loadClass方法。如果父類加載器為 null,則使用虛擬機的內置類加載器。

    ? ?

    3.調用?findClass(name)?方法查找類。











    /-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    PS: 如果用戶想從自定義的目錄下加載類(.class文件),則可以自定義類加載器:


    ?

    總結

    以上是生活随笔為你收集整理的分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加载路径 及父委托机制的全部內容,希望文章能夠幫你解決所遇到的問題。

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