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

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

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

    快樂工作,享受生活

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      4 Posts :: 6 Stories :: 14 Comments :: 0 Trackbacks

    JVM在運行時會產生三個ClassLoader,Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader.其中,Bootstrap是用C++編寫的,我們在Java中看不到它,是null。它用來加載核心類庫,在JVM源代碼中這樣寫道:
    static const char classpathFormat[] =
    "%/lib/rt.jar:"
    "%/lib/i18n.jar:"
    "%/lib/sunrsasign.jar:"
    "%/lib/jsse.jar:"
    "%/lib/jce.jar:"
    "%/lib/charsets.jar:"
    "%/classes";
    知道為什么不需要在classpath中加載這些類了吧?人家在JVM啟動的時候就自動加載了,并且在運行過程中根本不能修改Bootstrap加載路徑。
    Extension ClassLoader用來加載擴展類,即/lib/ext中的類。
    最后AppClassLoader才是加載Classpath的。
    ClassLoader加載類用的是委托模型。即先讓Parent類(而不是Super,不是繼承關系)尋找,Parent找不到才自己找。看來ClassLoader還是蠻孝順的。三者的關系為:AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent為Bootstrap ClassLoader。加載一個類時,首先BootStrap先進行尋找,找不到再由ExtClassLoader尋找,最后才是AppClassLoader。
    為什么要設計的這么復雜呢?其中一個重要原因就是安全性。比如在Applet中,如果編寫了一個java.lang.String類并具有破壞性。假如不采用這種委托機制,就會將這個具有破壞性的String加載到了用戶機器上,導致破壞用戶安全。但采用這種委托機制則不會出現這種情況。因為要加載java.lang.String類時,系統最終會由Bootstrap進行加載,這個具有破壞性的String永遠沒有機會加載。
    我們來看這段代碼:
    //A.java
    public class A{
    public static void main(String[] args){
    A a=new A();
    System.out.println(System.getProperty("java.ext.dirs"));
    System.out.println(a.getClass().getClassLoader());
    B b=new B();
    b.print();
    }
    }
    //B.java
    public class B{
    public void print(){
    System.out.println(this.getClass().getClassLoader());
    }
    }
    1、我們將它放在Classpath中,則打印出
    sun.misc.Launcher$AppClassLoader@92e78c
    sun.misc.Launcher$AppClassLoader@92e78c
    可見都是由AppClassLoader來加載的。
    2、我們將其放在%jre%/lib/ext/classes(即ExtClassLoader的加載目錄。其加載/lib/ext中的jar文件或者子目錄classes中的class文件)中。則會打印出:
    sun.misc.Launcher$ExtClassLoader
    sun.misc.Launcher$ExtClassLoader
    3、我們將A.class放到%jre%/lib/ext/classes中,而將B.class放到classpaht中又會怎么樣呢?結果是:
    sun.misc.Launcher$ExtClassLoader
    Exception in thread "main" java.lang.NoClassDefFoundError:B
    at A.main(A.java:6)
    怎么會這樣呢?這其中有一個重要的問題:A類當然是由ExtClassLoader來加載的,B類要由哪個加載呢?B類要由調用它自己的類的類加載器(真拗口)。也就是說,A調用了B,所以B由A的類加載器ExtClassLoader來加載。ExtClassLoader根據委托機制,先拜托Bootstrap加載,Bootstrap沒有找到。然后它再自己尋找B類,還是沒找到,所以拋出異常。ExtClassLoader不會請求AppClassLoader來加載!你可能會想:這算什么問題,我把兩個類放到一起不就行了?
    呵呵,沒這么簡單。比如JDBC是核心類庫,而各個數據庫的JDBC驅動則是擴展類庫或在classpath中定義的。所以JDBC由Bootstrap ClassLoader加載,而驅動要由AppClassLoader加載。等等,問題來了,Bootstrap不會請求AppClassLoader加載類啊。那么,他們怎么實現的呢?我就涉及到一個Context ClassLoader的問題,調用Thread.getContextClassLoader。

    posted on 2007-11-06 13:46 柯西 閱讀(91) 評論(0)  編輯  收藏 所屬分類: java編程技術

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


    網站導航:
     
    主站蜘蛛池模板: 成全视频免费观看在线看| 亚洲综合激情六月婷婷在线观看| 久久亚洲国产最新网站| 亚洲国产精品综合一区在线| 亚洲区视频在线观看| 亚洲大码熟女在线观看| 在线免费观看毛片网站| 亚洲aⅴ无码专区在线观看春色| 免费理论片51人人看电影| 亚洲国产熟亚洲女视频| 午夜福利不卡片在线播放免费| 免费大片在线观看网站| 亚洲精品白浆高清久久久久久| a一级爱做片免费| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 国产a级特黄的片子视频免费| 亚洲AV无码精品国产成人| 国产成人免费一区二区三区| 狼色精品人妻在线视频免费| 夜夜春亚洲嫩草影院| 亚洲人成网站看在线播放| 老司机精品免费视频| 亚洲精品高清久久| 成人免费视频69| 亚洲伊人色欲综合网| 亚洲乱亚洲乱妇无码| 免费乱码中文字幕网站| 中文字幕亚洲男人的天堂网络| 久久免费美女视频| 亚洲国产成人精品无码区在线秒播 | 亚洲精品国产专区91在线| 免费看黄视频网站| 国产精品亚洲а∨无码播放不卡 | 亚欧在线精品免费观看一区| 亚洲日产乱码一二三区别| 亚洲国产电影av在线网址| 亚洲熟妇AV乱码在线观看| 国产啪亚洲国产精品无码| 免费观看无遮挡www的小视频| 在线亚洲v日韩v| 免费高清av一区二区三区|