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

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

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

    beauty_beast

    上善若水 厚德載物

    URLClassLoader加載class到當前線程類加載器

    Posted on 2006-09-26 15:14 柳隨風 閱讀(627) 評論(0)  編輯  收藏 所屬分類: java基礎

    本文完全轉自http://m.tkk7.com/hiswing/archive/2006/08/25/65764.html
     我們知道,Java利用ClassLoader將類載入內存,并且在同一應用中,可以有很多個ClassLoader,通過委派機制,把裝載的任務傳遞給上級的裝載器的,依次類推,直到啟動類裝載器(沒有上級類裝載器)。如果啟動類裝載器能夠裝載這個類,那么它會首先裝載。如果不能,則往下傳遞。當父類為null時,JVM內置的類(稱為:bootstrap class loader)就會充當父類。想想眼下的越來越多用XML文件做配置文件或者是描述符、部署符。其實這些通過XML文檔描述的配置信息最終都要變成Java類,基實都是通過ClassLoader來完成的。URLClassLoader是ClassLoader的子類,它用于從指向 JAR 文件和目錄的 URL 的搜索路徑加載類和資源。也就是說,通過URLClassLoader就可以加載指定jar中的class到內存中。

    下面來看一個例子,在該例子中,我們要完成的工作是利用URLClassLoader加載jar并運行其中的類的某個方法。

    首先我們定義一個接口,使所有繼承它的類都必須實現action方法,如下:

    public ? interface ?ActionInterface? {
    ????
    public ?String?action();
    }

    完成后將其打包為testInterface.jar文件。

    接下來新建一工程,為了編譯通過,引入之前打好的testInterface.jar包。并創建TestAction類,使它實現ActionInterface接口。如下:

    public ? class ?TestAction? implements ?ActionInterface? {
    ????
    public ?String?action()? {
    ????????
    return ? " com.mxjava.TestAction.action " ;
    ????}

    }

    完成后將其打包為test.jar,放在c盤根目錄下。下面要做的就是利用URLClassLoader加載并運行TestAction的action方法,并將返回的值打印在控制臺上。

    新建一工程,引入testInterface.jar包。并創建一可執行類(main方法),在其中加入如下代碼:

    URL?url? = ? new ?URL(“file:C: / test.jar”);
    URLClassLoader?myClassLoader?
    = ? new ?URLClassLoader( new ?URL[]? {?url?} );
    Class?myClass?
    = ?myClassLoader.loadClass(“com.mxjava.TestAction”);
    ActionInterface?action?
    = ?(ActionInterface)myClass.newInstance();
    System.out.println(action.action());

      在上面的例子中,首先利用URLClassLoader加載了C:\test.jar包,將其中的com.mxjava.TestAction類載入內存,將其強制轉型為testInterface包中的ActionInterface類型,最后調用其action方法,并打印到控制臺中。

      執行程序后,在控制臺上如期打印出我們想要的內容。但是,事情并沒有那么簡單,當我們將該代碼移動web應用中時,就會拋出異常。原來,Java為我們提供了三種可選擇的ClassLoader:
    1.?系統類加載器或叫作應用類加載器 (system classloader or application classloader)
    2.?當前類加載器
    3.?當前線程類加載器

      在上例中我們使用javac命令來運行該程序,這時候使用的是系統類加載器 (system classloader)。這個類加載器處理 -classpath下的類加載工作,可以通過ClassLoader.getSystemClassLoader()方法調用。 ClassLoader 下所有的 getSystemXXX()的靜態方法都是通過這個方法定義的。在代碼中,應該盡量少地調用這個方法,以其它的類加載器作為代理。否則代碼將只能工作在簡單的命令行應用中。當在web應用中時,服務器也是利用ClassLoader來加載class的,由于ClassLoader的不同,所以在強制轉型時JVM認定不是同一類型。(在JAVA中,一個類用其完全匹配類名(fully qualified class name)作為標識,這里指的完全匹配類名包括包名和類名。但在JVM中一個類用其全名和一個加載類ClassLoader的實例作為唯一標識。因此,如果一個名為Pg的包中,有一個名為Cl的類,被類加載器KlassLoader的一個實例kl1加載,Cl的實例,即C1.class在JVM中表示為(Cl, Pg, kl1)。這意味著兩個類加載器的實例(Cl, Pg, kl1) 和 (Cl, Pg, kl2)是不同的,被它們所加載的類也因此完全不同,互不兼容的。)為了能夠使程序正確運行,我們首要解決的問題就是,如何將URLClassLoader加載的類,同當前ClassLoader保持在同一類加載器中。解決方法很簡單,利用java提供的第三種ClassLoader—當前線程類加載器即可。jdk api文檔就會發現,URLClassLoader提供了三種構造方式:

    // 使用默認的委托父?ClassLoader?為指定的?URL?構造一個新?URLClassLoader。?
    URLClassLoader(URL[]?urls)?
    // 為給定的?URL?構造新?URLClassLoader。?
    URLClassLoader(URL[]?urls,?ClassLoader?parent)?
    // 為指定的?URL、父類加載器和?URLStreamHandlerFactory?創建新?URLClassLoader。
    URLClassLoader(URL[]?urls,?ClassLoader?parent,?URLStreamHandlerFactory?factory)?

    接下來要做的就是,在構造URLClassLoader時,將當前線程類加載器置入即可。如下:

    URLClassLoader?myClassLoader? = ? new ?URLClassLoader( new ?URL[]? {?url?} ,?Thread.currentThread().getContextClassLoader());

    總結:
      
    Java是利用ClassLoader來加載類到內存的,ClassLoader本身是用java語言寫的,所以我們可以擴展自己的ClassLoader。利用URLClassLoader可以加載指定jar包中的類到內存。在命行上利用URLClassLoader加載jar時,是使用系統類加載器來加載class的,所以在web環境下,就會出錯。這是因為JVM中一個類用其全名和一個加載類ClassLoader的實例作為唯一標識的。我們只要利用URLClassLoader的第二種構造方法并傳入當前線程類加載器即可解決。

    參考:
    http://m.tkk7.com/sharajava/archive/2006/07/25/59946.html
    http://kb.csdn.net/java/Articles/200510/a1843d60-05b1-456f-9f72-811cb45ea4ae.html

    主站蜘蛛池模板: a色毛片免费视频| 国产精品亚洲а∨天堂2021| 国产99视频精品免费视频76| 亚洲精品国偷自产在线| 一级做a爱片特黄在线观看免费看 一级做a爱过程免费视 | 免费一级毛片在线播放视频免费观看永久 | 亚洲av永久无码精品网址| 免费无码黄网站在线观看| 亚洲日本VA午夜在线影院| 香蕉免费看一区二区三区| 亚洲真人日本在线| 拍拍拍无挡视频免费观看1000| 亚洲色爱图小说专区| 亚洲av片在线观看| 波多野结衣免费视频观看| 亚洲日本在线看片| 3344免费播放观看视频| 亚洲综合色区在线观看| 国产日韩一区二区三免费高清| 亚洲AV日韩AV永久无码久久| 无码国产精品一区二区免费3p| 国产大片免费观看中文字幕| 亚洲精品中文字幕麻豆| 永久免费av无码不卡在线观看| 亚洲欧美日韩综合久久久久 | 亚洲中文字幕久久精品无码喷水| 亚洲中文无码a∨在线观看| 亚洲啪啪免费视频| 最新仑乱免费视频| 亚洲人成免费电影| 国产一级淫片a视频免费观看| 久久久久女教师免费一区| 亚洲精品美女久久久久9999| 国产精品成人免费一区二区| 亚洲福利一区二区三区| 国产精品免费播放| 久久久久久久久久国产精品免费| 亚洲日韩国产欧美一区二区三区| 亚洲国产午夜中文字幕精品黄网站| 亚洲欧美成人综合久久久| 中文字幕不卡亚洲 |