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

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

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

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Java ClassLoader基礎(chǔ)知識

    Posted on 2011-10-20 11:27 瘋狂 閱讀(1037) 評論(0)  編輯  收藏 所屬分類: java
    Java中一共有四個類加載器,之所以叫類加載器,是程序要用到某個類的時候,要用類加載器載入內(nèi)存。
        這四個類加載器分別為:Bootstrap ClassLoaderExtension ClassLoaderAppClassLoader
    URLClassLoader,他們的作用其實(shí)從名字就可以大概推測出來了。其中AppClassLoader在很多地方被叫做System ClassLoader

    Bootstrap ClassLoader是在JVM開始運(yùn)行的時候加載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是用來加載擴(kuò)展類,即/lib/ext中的類。
    AppClassLoader用來加載Classpath的類,是和我們關(guān)系最密切的類。
    URLClassLoader用來加載網(wǎng)絡(luò)上遠(yuǎn)程的類,暫且不討論。

    它們之間的關(guān)系:

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

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

    3.classloader的委托機(jī)制:當(dāng)?shù)燃壉容^低的ClassLoader要加載某個類的時候,它首先會請求Parent加載器來加載,Parent再請求它的Parent
    比如現(xiàn)在Ext要加載了,它往上請求。如果最大的Bootstrap找不到,那么Boot會叫Ext自己找找,Ext找不到,是不會讓下一級的App去找的,此時就報出ClassNotFoundException

    4.類A調(diào)用類B,B會要求調(diào)用它的類的類加載器來加載它,也就是B會要求加載A的加載器來加載B。這就會有個問題,如果他們在一起,那沒關(guān)系,肯定某個classloader會把它們倆都加載好。但是如果A在/lib/ext文件夾中,而B在Classpath中呢?過程是這樣的首先加載A,那么一層層上到Bootstrap Classloader,boot沒找到所以ext自己找,找到了,沒問題;加載B,因?yàn)锳調(diào)用了B,所以也從bootstrap來找,沒找到,然后A的ext classloader來找還是沒找到,但是再也不會往下調(diào)用了,于是報出ClassNotFoundException。
    但是現(xiàn)實(shí)生活中有很多應(yīng)用,比如JDBC核心方法在核心庫而驅(qū)動在擴(kuò)展庫,是必定在兩個地方的,那怎么辦呢?要用到Context ClassLoader我們在建立一個線程Thread的時候,可以為這個線程通過setContextClassLoader方法來指定一個合適的classloader作為這個線程的context classloader,當(dāng)此線程運(yùn)行的時候,我們可以通過getContextClassLoader方法來獲得此context classloader,就可以用它來載入我們所需要的Class。默認(rèn)的是system classloader。利用這個特性,我們可以“打破”classloader委托機(jī)制了,父classloader可以獲得當(dāng)前線程的context classloader,而這個context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以從其獲得所需的 Class,這就打破了只能向父classloader請求的限制了。這個機(jī)制可以滿足當(dāng)我們的classpath是在運(yùn)行時才確定,并由定制的 classloader加載的時候,由system classloader(即在jvm classpath中)加載的class可以通過context classloader獲得定制的classloader并加載入特定的class(通常是抽象類和接口,定制的classloader中是其實(shí)現(xiàn)),例如web應(yīng)用中的servlet就是用這種機(jī)制加載的.
    轉(zhuǎn)載自:http://www.tkk7.com/clraychen/archive/2008/02/20/180868.html
    主站蜘蛛池模板: 成人国产精品免费视频| 亚洲成人免费电影| 911精品国产亚洲日本美国韩国| 国产成人精品免费午夜app| 男人的天堂av亚洲一区2区| 亚洲另类激情综合偷自拍图| 日韩在线播放全免费| 国产亚洲精品美女久久久久久下载| 国产亚洲大尺度无码无码专线 | 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲性一级理论片在线观看| 热99re久久精品精品免费| a毛片视频免费观看影院| 2020天堂在线亚洲精品专区| 国内精品99亚洲免费高清| 国国内清清草原免费视频99| rh男男车车的车车免费网站| 久久精品国产亚洲AV蜜臀色欲| 国产亚洲精品看片在线观看 | 一级毛片免费毛片一级毛片免费| 久久人午夜亚洲精品无码区| 久久亚洲私人国产精品vA| 免费a级黄色毛片| 综合在线免费视频| 中文字幕无码毛片免费看| 欧洲亚洲国产精华液| 亚洲日本国产精华液| 黑人大战亚洲人精品一区| 日本人护士免费xxxx视频| 久久精品成人免费观看| 一级毛片免费全部播放| 亚洲AV无码专区国产乱码不卡| 精品亚洲国产成AV人片传媒| 国产亚洲AV夜间福利香蕉149| 暖暖日本免费在线视频| 免费在线看v网址| 日本高清不卡aⅴ免费网站| 美景之屋4在线未删减免费 | 日韩人妻无码精品久久免费一| 免费一级毛suv好看的国产网站| 亚洲AV日韩综合一区尤物|