簡體   English   中英

自定義Java類加載器和內部類

[英]Custom Java classloader and inner classes

我有這個方法(在我自己的類加載器中)從zip加載類:

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);
    }
}

我試圖加載的zip看起來像這樣:

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 

有什么我做錯了嗎?

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

使用簡單查找private static Map<String, Class<?>>private static Map<String, Class<?>>來覆蓋該函數。 在加載每個類時,將其放入該映射中。

難點在於以正確的順序加載類,因為您當前的實現將不允許您跳回到搜索Zip並從新的findClass()方法調用defineClass()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM