ClassLoader.defineClass上的NoClassDefFoundError(错误名称)

时间:2011-11-29 03:49:42

标签: java class byte noclassdeffounderror

我有一个类文件,我正在通过对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后缀。

我不明白为什么抛出异常以及消息应该表示什么。任何帮助表示赞赏。

1 个答案:

答案 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)。