<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 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Java ClassLoader基礎(chǔ)知識(shí)

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

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

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

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

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

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

    4.類A調(diào)用類B,B會(huì)要求調(diào)用它的類的類加載器來(lái)加載它,也就是B會(huì)要求加載A的加載器來(lái)加載B。這就會(huì)有個(gè)問(wèn)題,如果他們?cè)谝黄?,那沒(méi)關(guān)系,肯定某個(gè)classloader會(huì)把它們倆都加載好。但是如果A在/lib/ext文件夾中,而B(niǎo)在Classpath中呢?過(guò)程是這樣的首先加載A,那么一層層上到Bootstrap Classloader,boot沒(méi)找到所以ext自己找,找到了,沒(méi)問(wèn)題;加載B,因?yàn)锳調(diào)用了B,所以也從bootstrap來(lái)找,沒(méi)找到,然后A的ext classloader來(lái)找還是沒(méi)找到,但是再也不會(huì)往下調(diào)用了,于是報(bào)出ClassNotFoundException。
    但是現(xiàn)實(shí)生活中有很多應(yīng)用,比如JDBC核心方法在核心庫(kù)而驅(qū)動(dòng)在擴(kuò)展庫(kù),是必定在兩個(gè)地方的,那怎么辦呢?要用到Context ClassLoader我們?cè)诮⒁粋€(gè)線程Thread的時(shí)候,可以為這個(gè)線程通過(guò)setContextClassLoader方法來(lái)指定一個(gè)合適的classloader作為這個(gè)線程的context classloader,當(dāng)此線程運(yùn)行的時(shí)候,我們可以通過(guò)getContextClassLoader方法來(lái)獲得此context classloader,就可以用它來(lái)載入我們所需要的Class。默認(rèn)的是system classloader。利用這個(gè)特性,我們可以“打破”classloader委托機(jī)制了,父classloader可以獲得當(dāng)前線程的context classloader,而這個(gè)context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以從其獲得所需的 Class,這就打破了只能向父classloader請(qǐng)求的限制了。這個(gè)機(jī)制可以滿足當(dāng)我們的classpath是在運(yùn)行時(shí)才確定,并由定制的 classloader加載的時(shí)候,由system classloader(即在jvm classpath中)加載的class可以通過(guò)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
    主站蜘蛛池模板: 亚洲成Av人片乱码色午夜| 一区二区三区观看免费中文视频在线播放 | 无码AV动漫精品一区二区免费 | 中文字幕一区二区免费| 朝桐光亚洲专区在线中文字幕| 亚洲另类春色校园小说| 亚洲AV无码专区电影在线观看| 亚洲精品岛国片在线观看| 国产精品公开免费视频| 在线视频免费观看高清| 足恋玩丝袜脚视频免费网站| 人人玩人人添人人澡免费| 久久国产乱子伦精品免费午夜 | 亚洲国产人成精品| 日韩高清免费观看| 成人免费看吃奶视频网站| 亚洲精品国产免费| 2020因为爱你带字幕免费观看全集| 女同免费毛片在线播放| 久久久久国色AV免费观看| 日韩毛片一区视频免费| 免费一级毛片在线播放视频免费观看永久 | 亚洲国产精品综合久久20| 亚洲神级电影国语版| 亚洲黄色免费在线观看| 亚洲乱亚洲乱淫久久| 亚洲嫩模在线观看| 67pao强力打造67194在线午夜亚洲| 亚洲成熟xxxxx电影| 久久精品国产亚洲77777| 久久亚洲AV无码精品色午夜| 亚洲国产精品久久66| 久久精品a亚洲国产v高清不卡 | 99在线视频免费观看视频| 色播精品免费小视频| 99在线视频免费观看视频 | 亚洲国产精品综合久久久| 亚洲精品国产福利在线观看| 亚洲伊人久久大香线蕉影院| 亚洲人成网国产最新在线| 亚洲熟女乱色一区二区三区|