2011-03-25 51 views
3

我有這樣的方法(在我自己的類加載器),從拉鍊加載類:定製的Java類加載器和內部類

ZipInputStream in = new ZipInputStream(new FileInputStream(zip)); 
ZipEntry entry; 
while ((entry = in.getNextEntry()) != null) { 
    if (!entry.isDirectory()) { 
     byte[] buffer = new byte[(int) entry.getSize()]; 
     in.read(buffer); 
     if (!entry.getName().endsWith(".class")) 
      continue; 
     String name = entry.getName().replace(".class", "").replace("/", "."); 
     Class<?> cls = this.defineClass(name, buffer, 0, buffer.length); 
     this.resolveClass(cls); 
    } 
} 

,即時通訊試圖裝入的拉鍊是這樣的:

TestClass.class 
TestClass$SomeOtherInnerClass.class 

我的問題是,defineClass()無法加載TestClass $ SomeOtherInnerClass。如果這個類是實際的TestClass之前加載我得到這個:

java.lang.NoClassDefFoundError: TestClass 

我也試着先加載TestClass.class但隨後即時收到此錯誤:

java.lang.ClassFormatError: Wrong InnerClasses attribute length in class file TestClass 

是否有什麼我做錯了?

+0

我有同樣的問題,我如何加載內部類?,我的類A加載正確,但我的類A $ B1不...沒有找到一種方法來加載內部類...你有任何進展? – jrey 2011-04-13 05:32:54

回答

3

我看起來像你可能不會凌駕ClassLoader.findClass()。沒有這樣做,你正在擴展的ClassLoader不知道如何找到這些類。

用一些簡單地在private static Map<String, Class<?>>中查找該類的函數覆蓋該函數。當您加載每個班級時,將其放入該地圖。

難度在於按照正確的順序加載課程,因爲您當前的實施不允許您跳回搜索Zip並從您的新findClass()方法中調用defineClass()

+0

我現在的代碼如下所示:[link](http://pastebin.com/raw.php?i=ngE2DJK9)但是我的問題依然存在,如果我嘗試首先加載TestClass,它會拋出錯誤,因爲它無法找到內部類(因爲它尚未定義)我不知道如何解決這個問題:/ – 2011-03-25 20:22:31

+0

@sidd你可以在這裏發佈你的代碼嗎? – Jonathan 2011-03-28 12:43:45

0

至少有一個錯誤,因爲您沒有(必然)完全讀取緩衝區(並且ZipEntry.getSize可能會返回-1)。