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

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

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

    離弦之Ray

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      55 Posts :: 0 Stories :: 33 Comments :: 0 Trackbacks
        Java中一共有四個類加載器,之所以叫類加載器,是程序要用到某個類的時候,要用類加載器載入內存。
        這四個類加載器分別為:Bootstrap ClassLoaderExtension ClassLoaderAppClassLoader
    URLClassLoader,他們的作用其實從名字就可以大概推測出來了。其中AppClassLoader在很多地方被叫做System ClassLoader

    Bootstrap ClassLoader是在JVM開始運行的時候加載java的核心類,是用C++編寫的,它用來加載核心類庫,在JVM源代碼中這樣寫道:
    static const char classpathFormat[] =
    "%/lib/rt.jar:"
    "%/lib/i18n.jar:"
    "%/lib/sunrsasign.jar:"
    "%/lib/jsse.jar:"
    "%/lib/jce.jar:"
    "%/lib/charsets.jar:"
    "%/classes";
    Extension ClassLoader是用來加載擴展類,即/lib/ext中的類。
    AppClassLoader用來加載Classpath的類,是和我們關系最密切的類。
    URLClassLoader用來加載網絡上遠程的類,暫且不討論。

    它們之間的關系:

    1.Parent-Child,按順序從大到小。不是簡單的繼承關系。

    2.ClassLoader有個getParent的方法,但是Ext ClassLoader調用后得到的是null,bootstrap是JVM自己的,用戶看不到。

    3.classloader的委托機制:當等級比較低的ClassLoader要加載某個類的時候,它首先會請求Parent加載器來加載,Parent再請求它的Parent
    比如現在Ext要加載了,它往上請求。如果最大的Bootstrap找不到,那么Boot會叫Ext自己找找,Ext找不到,是不會讓下一級的App去找的,此時就報出ClassNotFoundException

    4.類A調用類B,B會要求調用它的類的類加載器來加載它,也就是B會要求加載A的加載器來加載B。這就會有個問題,如果他們在一起,那沒關系,肯定某個classloader會把它們倆都加載好。但是如果A在/lib/ext文件夾中,而B在Classpath中呢?過程是這樣的首先加載A,那么一層層上到Bootstrap Classloader,boot沒找到所以ext自己找,找到了,沒問題;加載B,因為A調用了B,所以也從bootstrap來找,沒找到,然后A的ext classloader來找還是沒找到,但是再也不會往下調用了,于是報出ClassNotFoundException。
    但是現實生活中有很多應用,比如JDBC核心方法在核心庫而驅動在擴展庫,是必定在兩個地方的,那怎么辦呢?要用到Context ClassLoader我們在建立一個線程Thread的時候,可以為這個線程通過setContextClassLoader方法來指定一個合適的classloader作為這個線程的context classloader,當此線程運行的時候,我們可以通過getContextClassLoader方法來獲得此context classloader,就可以用它來載入我們所需要的Class。默認的是system classloader。利用這個特性,我們可以“打破”classloader委托機制了,父classloader可以獲得當前線程的context classloader,而這個context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以從其獲得所需的 Class,這就打破了只能向父classloader請求的限制了。這個機制可以滿足當我們的classpath是在運行時才確定,并由定制的 classloader加載的時候,由system classloader(即在jvm classpath中)加載的class可以通過context classloader獲得定制的classloader并加載入特定的class(通常是抽象類和接口,定制的classloader中是其實現),例如web應用中的servlet就是用這種機制加載的.
    posted on 2008-02-20 15:16 離弦之ray的技術天空 閱讀(4833) 評論(4)  編輯  收藏 所屬分類: Java

    Feedback

    # re: Java ClassLoader基礎知識(網上內容整理后所得) 2008-07-24 02:42 Yvon
    正在找這方面的資料,謝謝了  回復  更多評論
      

    # re: Java ClassLoader基礎知識(網上內容整理后所得) 2009-05-19 13:31 tianma
    非常感謝,受益匪淺  回復  更多評論
      

    # re: Java ClassLoader基礎知識(網上內容整理后所得) 2011-07-13 10:52 游客
    非常感謝。舉例說明很清楚。  回復  更多評論
      

    # re: Java ClassLoader基礎知識(網上內容整理后所得) 2011-10-20 11:18 @joe
    對classloader的理解又有了一點補充,謝謝  回復  更多評論
      

    主站蜘蛛池模板: 亚洲中文字幕无码一去台湾 | 最近中文字幕大全免费视频| 亚洲黄色免费观看| 亚洲同性男gay网站在线观看| 亚洲精品色播一区二区 | 自拍偷区亚洲国内自拍| 99久久精品日本一区二区免费| 亚洲美免无码中文字幕在线| 亚洲免费电影网站| 亚洲午夜国产精品无码| 亚洲精品二三区伊人久久| 色影音免费色资源| 亚洲乱码中文字幕在线| 日韩激情淫片免费看| 久久精品国产亚洲| 亚洲AV永久无码天堂影院 | a在线视频免费观看在线视频三区 a毛片成人免费全部播放 | 国产精品亚洲专区无码牛牛| 日本无卡码免费一区二区三区| 免费看黄网站在线看| 69天堂人成无码麻豆免费视频| 亚洲av无码片区一区二区三区| 真实乱视频国产免费观看| 一级毛片无遮挡免费全部| 最近2019中文字幕免费看最新| 无码天堂va亚洲va在线va| 亚洲精品无码永久在线观看你懂的| 日韩精品人妻系列无码专区免费 | 国产成人免费手机在线观看视频| 黄色a三级免费看| 亚洲αv久久久噜噜噜噜噜| 免费观看AV片在线播放| 亚洲国产精品无码专区| 一本岛v免费不卡一二三区| 亚洲AV人无码综合在线观看| 中文字幕在线成人免费看| 亚洲精品不卡视频| 丁香亚洲综合五月天婷婷| 美女黄频视频大全免费的| 亚洲AV日韩AV鸥美在线观看| 97无码免费人妻超级碰碰碰碰|