我有一个类文件,我正在通过对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后缀。“
我不明白为什么抛出异常以及消息应该表示什么。任何帮助表示赞赏。
答案 0 :(得分:3)
根据that method's documentation,如果您指定的名称(在您的情况下为NoClassDefFoundError
)与该类定义为具有的名称(内部不匹配),则会引发com.foo.sub.Foo
你的fileBytes
)。
要找出正确的名称,请尝试
System.out.println(defineClass.invoke(null, fileBytes, 0, fileBytes.length));
(应该打印类似class com.foo.sub.Foo
)。