我有一个类文件,我正在通过反射调用 ClassLoader.defineClass 从中读取字节并定义到 Class 对象中。
我收到的 NoClassDefFoundError 消息是:
Caused by: java.lang.NoClassDefFoundError: com/foo/sub/Foo (wrong name: com.foo.sub.Foo)
类文件是使用包“com.foo.sub”编译的,因此该类的完全限定名称将为“com.foo.sub.Foo”
对defineClass的调用:
byte[] fileBytes;
//... read file
Method defineClass;
//... initialize and prepare Method for reflective call
Class clazz = defineClass.invoke("com.foo.sub.Foo", fileBytes, 0, fileBytes.length);
javadocs 状态(关于 defineClass 的 name 参数):“name - 类的预期名称,如果不知道则为 null,使用 ' .'而不是 '/' 作为分隔符并且没有尾随 .class 后缀。"
我不明白为什么抛出异常以及消息应该指示什么。如有任何帮助,我们将不胜感激。
最佳答案
根据that method's documentation ,如果您指定的名称(在您的情况下为 com.foo.sub.Foo
)与该类定义自身的名称不匹配,它将引发 NoClassDefFoundError
(在您的 fileBytes
内)。
要找出正确的名称,请尝试类似的操作
System.out.println(defineClass.invoke(null, fileBytes, 0, fileBytes.length));
(应该打印类似 class com.foo.sub.Foo
的内容)。
关于java - ClassLoader.defineClass 上出现 NoClassDefFoundError (名称错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8305603/