java - ClassLoader.defineClass 上出现 NoClassDefFoundError (名称错误)

标签 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 状态(关于 defineClassname 参数):“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/

相关文章:

java - 从正在运行的服务更新 Activity UI

java - 获取调用方法的注解

javascript - 如何确定两个 ES6 类实例是否相等?

java - 在构造函数中,为什么在执行父类(super class)构造函数之前不能引用当前类的字段?

python - 如何在python中为套接字设置发送缓冲区大小

c++ - 包含 unordered_map 的结构的大小(以字节为单位)

swift - 我如何在 Swift 3 中将十六进制字符串转换为字节数组

java - 在java中将类内容打印到控制台

java - 接口(interface)中的内部类与类中

ios - 如何为以编程方式快速创建的 View 定义类和模块