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

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

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

    天下難事,必作于易;天下大事,必作于細(xì)
    如果我有方向,那就是遠(yuǎn)方
    posts - 11,comments - 8,trackbacks - 0

    轉(zhuǎn)載自http://blog.csdn.net/yuekun1172006/archive/2007/06/02/1634878.aspx

    類裝入器是 JVM 用來裝入類的類,它對于 Java 編程是非常重要的一個概念。一般情況下,程序員在編寫程序的時候都可以忽略類裝入器的存在性。但是對于服務(wù)器端編程或者是一些特殊情況下時候,深入了解類裝入器的機制以及其在不同情況下的實現(xiàn)還是非常必要的。

    首先,當(dāng)一個 JVM 啟動的時候,Java 缺省開始使用三個類裝入器。它們分別是:

    • 引導(dǎo)(Bootstrap)類裝入器;
    • 擴展(Extension)類裝入器;
    • 系統(tǒng)(System)類裝入器;

    它們分別實現(xiàn)如下的功能:

    • 引導(dǎo)類裝入器是用本地代碼實現(xiàn)的類裝入器。它負(fù)責(zé)將 <Java_Runtime_Home>/lib 下面的類庫加載到內(nèi)存中。
    • 擴展類裝入器是由 Sun 的 ExtClassLoader 實現(xiàn)的。它負(fù)責(zé)將 < Java_Runtime_Home >/lib/ext 或者由系統(tǒng)變量 java.ext.dir 指定位置中的類庫加載到內(nèi)存中。
    • 系統(tǒng)類裝入器又叫應(yīng)用程序類裝入器,是由 Sun 的 AppClassLoader 實現(xiàn)的。它負(fù)責(zé)將系統(tǒng)類路徑(CLASSPATH)中指定的類庫加載到內(nèi)存中。

    當(dāng)應(yīng)用程序需要加載某個類到內(nèi)存中的時候,類裝入器是如何工作的呢?這就設(shè)計到類裝入器的一個重要方面:代理機制。每一個類裝入器,除了引導(dǎo)類裝入器以外,都有一個父類裝入器。對于系統(tǒng)缺省定義的三個類裝入器,引導(dǎo)類裝入器是擴展類裝入器的父類裝入器,而擴展類裝入器是系統(tǒng)類裝入器的父類裝入器。當(dāng)然,應(yīng)用程序也可以使用自己的類裝入器來使用特定的方法來裝載類,因此,整個系統(tǒng)中的類裝入器就形成一個樹狀結(jié)構(gòu)。

    當(dāng)使用某個類裝入器來試圖裝載某個類的時候,該類裝入器會首先使用其父類裝入器來試圖裝載該類。對于每一個裝載進(jìn)來的類,JVM 都會給其分配一個唯一的 ID。因此,不同類裝入器可以裝載同一個類到 JVM 中。例如,對于如下圖結(jié)構(gòu)的 ClassLoaderAClassLoaderB


    圖 1 類裝入器的結(jié)構(gòu)
    圖 1 類裝入器的結(jié)構(gòu)

    假設(shè)類 C 在系統(tǒng)類裝入器指定的類路徑中,則無論是使用 ClassLoaderA 還是使用 ClassLoaderB,都只會得到同樣一個類 C

    但是如果類 C 分別在 ClassLoaderA 以及 ClassLoaderB 指定的類庫中,則使用 ClassLoaderA 得到到類 C 實例會不同于 ClassLoaderB 得到的類 C 實例。盡管兩個類裝入器在同一個 JVM 中。

    上面的類裝入器的向上代理結(jié)構(gòu)看上去很完美了,但是,當(dāng)系統(tǒng)變得復(fù)雜的時候,就還是顯得不夠用了。

    例如,當(dāng) Java 引入了 JNDI 以后,JNDI 核心部分是通過引導(dǎo) 類裝入器在 JVM 啟動的時候裝載進(jìn)入 JVM 的。而 JDNI 核心部分是通過配置信息來在運行時候裝載定義在用戶的類路徑中的特定類來完成特定需要。而這是上面定義的類裝入器的向上代理模式所不能支持的。

    為了解決這個問題,Java 2 中引入了線程上下文(Thread Content)類裝入器的概念,每一個線程有一個 Context 類裝入器。這個 Context 類裝入器是通過方法 Thread.setContextClassLoader() 設(shè)置的,如果當(dāng)前線程在創(chuàng)建后沒有調(diào)用這個方法設(shè)置 Context 類裝入器,則當(dāng)前線程從他的父線程繼承 Context 類裝入器。如果整個應(yīng)用都沒有設(shè)置 Context 類裝入器,則系統(tǒng)類裝入器被設(shè)置為所有線程的 Context 類裝入器。

    對于我們上面所說 JNDI 的情況,引導(dǎo) 類裝入器裝載進(jìn)入的 JNDI 核心類會使用 Context 類裝入器來裝載其所需要的 JNDI 實現(xiàn)類,而不是將該裝載任務(wù)代理給其父類裝入器來完成。這樣,就解決了上面的問題。可以認(rèn)為 Context 類裝入器在傳統(tǒng)的 Java 向上代理機制上打開了一個后門。Context 類裝入器在 J2EE 中使用的很廣泛,比如 Java 命名服務(wù)(JNDI),Java API for XML Parsing(JAXP)(注:在 Java1.4 中 JAXP 才作為 Java 的核心類的一部分,它才開始使用 Context 類裝入器來加載不同的實現(xiàn)類)等。

    簡單而言,Java 中的類裝入器就是上面幾種,但是,在具體使用中,還是有很多變化,我們下面分別對于一些情況進(jìn)行說明。

    posted on 2007-11-22 10:51 flyepp 閱讀(570) 評論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 九九免费久久这里有精品23| 亚洲综合激情视频| 国产成人亚洲综合在线| 午夜神器成在线人成在线人免费| 亚洲大片免费观看| 亚洲精品在线免费观看| 亚洲精品亚洲人成在线麻豆| 免费A级毛片无码视频| 亚洲福利在线观看| 99精品视频在线观看免费专区| 亚洲国产精品久久| h在线观看视频免费网站| 亚洲精品福利网泷泽萝拉| 国产乱子精品免费视观看片| 久久精品亚洲AV久久久无码| 成人毛片免费视频| 亚洲爆乳AAA无码专区| 免费一级毛片在级播放| 99久久国产免费-99久久国产免费 99久久国产免费中文无字幕 | 亚洲日本国产乱码va在线观看| 最近2019中文字幕免费直播 | 韩国日本好看电影免费看| 精品久久久久亚洲| 国产亚洲?V无码?V男人的天堂| 国产午夜无码精品免费看动漫| 亚洲激情视频在线观看| 黄页免费的网站勿入免费直接进入| 学生妹亚洲一区二区| 国产麻豆成人传媒免费观看| 久久亚洲精精品中文字幕| 欧洲乱码伦视频免费| 国产成人精品亚洲一区| 亚洲国产精品无码久久久蜜芽| 2019中文字幕免费电影在线播放 | 日韩a毛片免费观看| 亚洲精品乱码久久久久久| 亚洲高清中文字幕免费| 婷婷国产偷v国产偷v亚洲| 亚洲精品成人片在线播放| 91成人免费观看网站| 又硬又粗又长又爽免费看 |