<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    歡迎光臨郝學(xué)武的blog。

    classloader機(jī)制

    Posted on 2010-04-12 16:35 陜西BOY 閱讀(191) 評論(0)  編輯  收藏

    當(dāng)JVM(Java虛擬機(jī))啟動時,會形成由三個類加載器組成的初始類加載器層次結(jié)構(gòu):



           bootstrap classloader

           extension classloader

           system classloader



    bootstrap classloader -引導(dǎo)(也稱為原始)類加載器,它負(fù)責(zé)加載Java的核心類。在Sun的JVM中,在執(zhí)行java的命令中使用-Xbootclasspath選項(xiàng)或使用 - D選項(xiàng)指定sun.boot.class.path系統(tǒng)屬性值可以指定附加的類。這個加載器的是非常特殊的,它實(shí)際上不是 java.lang.ClassLoader的子類,而是由JVM自身實(shí)現(xiàn)的。大家可以通過執(zhí)行以下代碼來獲得bootstrap classloader加載了那些核心類庫:

       URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();

       for (int i = 0; i < urls.length; i++) {

         System.out.println(urls.toExternalform());

       }

    在我的計算機(jī)上的結(jié)果為:

    文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/dom.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/sax.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xalan-2.3.1.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xercesImpl-2.0.0.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xml-apis.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/endorsed/xsltc.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/rt.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/i18n.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/sunrsasign.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/jsse.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/jce.jar

    文件:/C:/j2sdk1.4.1_01/jre/lib/charsets.jar

    文件:/C:/j2sdk1.4.1_01/jre/classes

    這時大家知道了為什么我們不需要在系統(tǒng)屬性CLASSPATH中指定這些類庫了吧,因?yàn)镴VM在啟動的時候就自動加載它們了。



    extension classloader -擴(kuò)展類加載器,它負(fù)責(zé)加載JRE的擴(kuò)展目錄(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系統(tǒng)屬性指定的)中JAR的類包。這為引入除Java核心類以外的新功能提供了一個標(biāo)準(zhǔn)機(jī)制。因?yàn)槟J(rèn)的擴(kuò)展目錄對所有從同一個JRE中啟動的JVM都是通用的,所以放入這個目錄的 JAR類包對所有的JVM和system classloader都是可見的。在這個實(shí)例上調(diào)用方法getParent()總是返回空值null,因?yàn)橐龑?dǎo)加載器bootstrap classloader不是一個真正的ClassLoader實(shí)例。所以當(dāng)大家執(zhí)行以下代碼時:

       System.out.println(System.getProperty("java.ext.dirs"));

       ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();

       System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());

    結(jié)果為:

    C:\j2sdk1.4.1_01\jre\lib\ext

    the parent of extension classloader : null

    extension classloader是system classloader的parent,而bootstrap classloader是extension classloader的parent,但它不是一個實(shí)際的classloader,所以為null。



    system classloader -系統(tǒng)(也稱為應(yīng)用)類加載器,它負(fù)責(zé)在JVM被啟動時,加載來自在命令java中的-classpath或者java.class.path系統(tǒng)屬性或者 CLASSPATH*作系統(tǒng)屬性所指定的JAR類包和類路徑。總能通過靜態(tài)方法ClassLoader.getSystemClassLoader()找到該類加載器。如果沒有特別指定,則用戶自定義的任何類加載器都將該類加載器作為它的父加載器。執(zhí)行以下代碼即可獲得:

       System.out.println(System.getProperty("java.class.path"));

    輸出結(jié)果則為用戶在系統(tǒng)屬性里面設(shè)置的CLASSPATH。

    classloader 加載類用的是全盤負(fù)責(zé)委托機(jī)制。所謂全盤負(fù)責(zé),即是當(dāng)一個classloader加載一個Class的時候,這個Class所依賴的和引用的所有 Class也由這個classloader負(fù)責(zé)載入,除非是顯式的使用另外一個classloader載入;委托機(jī)制則是先讓parent(父)類加載器 (而不是super,它與parent classloader類不是繼承關(guān)系)尋找,只有在parent找不到的時候才從自己的類路徑中去尋找。此外類加載還采用了cache機(jī)制,也就是如果 cache中保存了這個Class就直接返回它,如果沒有才從文件中讀取和轉(zhuǎn)換成Class,并存入cache,這就是為什么我們修改了Class但是必須重新啟動JVM才能生效的原因。





    每個ClassLoader加載Class的過程是:

    1.檢測此Class是否載入過(即在cache中是否有此Class),如果有到8,如果沒有到2

    2.如果parent classloader不存在(沒有parent,那parent一定是bootstrap classloader了),到4

    3.請求parent classloader載入,如果成功到8,不成功到5

    4.請求jvm從bootstrap classloader中載入,如果成功到8

    5.尋找Class文件(從與此classloader相關(guān)的類路徑中尋找)。如果找不到則到7.

    6.從文件中載入Class,到8.

    7.拋出ClassNotFoundException.

    8.返回Class.



    其中5.6步我們可以通過覆蓋ClassLoader的findClass方法來實(shí)現(xiàn)自己的載入策略。甚至覆蓋loadClass方法來實(shí)現(xiàn)自己的載入過程。



    類加載器的順序是:

    先是bootstrap classloader,然后是extension classloader,最后才是system classloader。大家會發(fā)現(xiàn)加載的Class越是重要的越在靠前面。這樣做的原因是出于安全性的考慮,試想如果system classloader“親自”加載了一個具有破壞性的“java.lang.System”類的后果吧。這種委托機(jī)制保證了用戶即使具有一個這樣的類,也把它加入到了類路徑中,但是它永遠(yuǎn)不會被載入,因?yàn)檫@個類總是由bootstrap classloader來加載的


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     

    posts - 17, comments - 65, trackbacks - 0, articles - 28

    Copyright © 陜西BOY

    主站蜘蛛池模板: 欧洲乱码伦视频免费国产| 亚洲国产夜色在线观看| 一二三四在线观看免费中文在线观看| 欧亚精品一区三区免费| 亚洲天堂一区二区三区| 麻豆一区二区免费播放网站| 亚洲一级毛片在线观| 国产卡二卡三卡四卡免费网址| 亚洲国产日韩在线一区| 午夜小视频免费观看| 国产亚洲综合精品一区二区三区| 国产成人免费A在线视频| 黄色免费网址在线观看| 亚洲一区二区三区在线播放| 中文字幕免费播放| 久久亚洲一区二区| 国产福利在线免费| 亚洲av纯肉无码精品动漫| 亚洲女人被黑人巨大进入| 免费看一区二区三区四区| 亚洲人成电影在线天堂| 免费在线看v网址| 看一级毛片免费观看视频| 337p日本欧洲亚洲大胆裸体艺术 | 亚洲人成网站在线播放vr| 久久午夜无码免费| 亚洲乱码在线视频| 亚洲精品网站在线观看不卡无广告 | 中文字幕在线免费观看视频| 精品亚洲成a人片在线观看| 成年在线观看网站免费| 深夜免费在线视频| 4444亚洲国产成人精品| 日本不卡视频免费| 国产免费无码一区二区| 亚洲av永久综合在线观看尤物| 免费少妇a级毛片人成网| 91精品免费高清在线| 美景之屋4在线未删减免费| 亚洲国产精品第一区二区| 免费看美女让人桶尿口|