[英]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.