posts - 27,  comments - 14,  trackbacks - 0

          一、Java ClassLoader

          1,什么是ClassLoader
          與 C 或 C++ 編寫的程序不同,Java 程序并不是一個可執(zhí)行文件,而是由許多獨立的類文件組成,每一個文件對應于一個 Java 類。
          此外,這些類文件并非立即全部都裝入內(nèi)存,而是根據(jù)程序需要裝入內(nèi)存。ClassLoader 是 JVM 中將類裝入內(nèi)存的那部分。
          而且,Java ClassLoader 就是用 Java 語言編寫的。這意味著創(chuàng)建您自己的 ClassLoader 非常容易,不必了解 JVM 的微小細節(jié)。

          2,一些重要的方法
          A)loadClass
          ClassLoader.loadClass() 是ClassLoader的入口點。該方法的定義為:Class loadClass( String name, boolean resolve );
          name:JVM 需要的類的名稱,如 Foo 或 java.lang.Object。
          resolve:參數(shù)告訴方法是否需要解析類。

          B)defineClass
          defineClass方法是ClassLoader的主要訣竅。該方法接受由原始字節(jié)組成的數(shù)組并把它轉(zhuǎn)換成Class對象。

          C)findSystemClass
          findSystemClass方法從本地文件系統(tǒng)中尋找類文件,如果存在,就使用defineClass將原始字節(jié)轉(zhuǎn)換成Class對象,以將該文件轉(zhuǎn)換成類。

          D)resolveClass
          可以不完全地(不帶解析)裝入類,也可以完全地(帶解析)裝入類。當編寫我們自己的loadClass時可以調(diào)用resolveClass,這取決于loadClass的resolve參數(shù)的值。

          E)findLoadedClass
          findLoadedClass充當一個緩存:當請求loadClass裝入類時,它調(diào)用該方法來查看ClassLoader是否已裝入這個類,這樣可以避免重新裝入已存在類所造成的麻煩。

          3,Java2中ClassLoader的變動
          1)loadClass的缺省實現(xiàn)
          在Java2中l(wèi)oadClass的實現(xiàn)嵌入了大多數(shù)查找類的一般方法,并使您通過覆蓋findClass方法來定制它,在適當?shù)臅r候findClass會調(diào)用loadClass。
          這種方式的好處是可能不一定要覆蓋loadClass,只要覆蓋findClass就行了,這減少了工作量。

          2)新方法:findClass
          loadClass的缺省實現(xiàn)調(diào)用這個新方法。

          3)新方法:getSystemClassLoader
          如果覆蓋findClass或loadClass,getSystemClassLoader讓我們以實際ClassLoader對象來訪問系統(tǒng)ClassLoader,而不是固定的從findSystemClass 調(diào)用它。

          4)新方法:getParent
          為了將類請求委托給父ClassLoader,這個新方法允許ClassLoader獲取它的父ClassLoader。

          4,定制ClassLoader
          其實我們或多或少都使用過定制的ClassLoader,因為Applet查看器中就包含一個定制的ClassLoader。
          它不在本地文件系統(tǒng)中尋找類,而是訪問遠程服務器上的 Web 站點,經(jīng)過 HTTP 裝入原始的字節(jié)碼文件,并把它們轉(zhuǎn)換成JVM 內(nèi)的類。
          Applet查看器中的ClassLoader還可以做其它事情:它們支持安全性以及使不同的Applet在不同的頁面上運行而互不干擾。
          我們將寫一個自己的ClassLoader實現(xiàn)示例,它將實現(xiàn)如下步驟,這也是ClassLoader的工作原理:
          # 調(diào)用 findLoadedClass 來查看是否存在已裝入的類。
          # 如果沒有,那么采用那種特殊的神奇方式來獲取原始字節(jié)。
          # 如果已有原始字節(jié),調(diào)用defineClass將它們轉(zhuǎn)換成Class對象。
          # 如果沒有原始字節(jié),然后調(diào)用findSystemClass查看是否從本地文件系統(tǒng)獲取類。
          # 如果resolve參數(shù)是true,那么調(diào)用resolveClass解析Class對象。
          # 如果還沒有類,返回ClassNotFoundException。
          # 否則,將類返回給調(diào)用程序。
          話不多說,看看代碼先:
          FileClassLoader.java:

           1import java.io.ByteArrayOutputStream;
           2import java.io.File;
           3import java.io.FileInputStream;
           4import java.io.IOException;
           5
           6public class FileClassLoader extends ClassLoader {
           7  public Class findClass(String name) {
           8    byte[] data = loadClassData(name);
           9    return defineClass(name, data, 0, data.length);
          10  }

          11  
          12  private byte[] loadClassData(String name) {
          13    FileInputStream fis = null;
          14    byte[] data = null;
          15    try {
          16      fis = new FileInputStream(new File("D:\\project\\test\\" + name + ".class"));
          17      ByteArrayOutputStream baos = new ByteArrayOutputStream();
          18      int ch = 0;
          19      while ((ch = fis.read()) != -1{
          20        baos.write(ch);
          21      }

          22      data = baos.toByteArray();
          23    }
           catch (IOException e) {
          24      e.printStackTrace();
          25    }

          26    return data;
          27  }

          28}

          29

          MyApp.java:
          public class MyApp {
            
          public static void main(String[] args) throws Exception {
              FileClassLoader loader 
          = new FileClassLoader();
              Class objClass 
          = loader.findClass("MyApp");
              Object obj 
          = objClass.newInstance();
              System.out.println(objClass.getName());
              System.out.println(objClass.getClassLoader());
              System.out.println(obj);
            }

          }


          編譯并運行MyApp類,結(jié)果為:
          MyApp
          FileClassLoader@757aef
          MyApp@9cab16
          posted on 2007-07-11 21:04 Scott.Pan 閱讀(560) 評論(1)  編輯  收藏 所屬分類: J2EE

          FeedBack:
          # re: 深入了解Java ClassLoader、Bytecode 、ASM、cglib(轉(zhuǎn))
          2007-07-13 16:48 | sitinspring
          不錯.  回復  更多評論
            

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


          網(wǎng)站導航:
           
          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 山阴县| 武穴市| 四会市| 仙居县| 蓝山县| 遂昌县| 沐川县| 尚义县| 宾阳县| 富裕县| 栾城县| 东兰县| 古丈县| 石门县| 吉安县| 商水县| 庆云县| 内丘县| 宜川县| 永丰县| 花莲县| 和静县| 荥经县| 玉林市| 嘉善县| 安宁市| 五河县| 东兴市| 张家口市| 石河子市| 新干县| 大悟县| 毕节市| 个旧市| 久治县| 曲麻莱县| 尼勒克县| 彩票| 温泉县| 延边| 阆中市|