【问题标题】:Why are classLoader magic values in defineClass() throwing an exception?为什么 defineClass() 中的 classLoader 魔术值会引发异常?
【发布时间】:2011-12-06 20:47:07
【问题描述】:

我想编写一个类加载器,它可以帮助我在运行时实现自定义类并最终实现整个组件。现在我正在加载课程。

我正在尝试加载这个 role.java 文件。但是,当我到达这部分代码时:

myClass = super.defineClass(className, classData, 0, classData.length);

我得到了这个例外:

线程 "main" java.lang.ClassFormatError 中的异常:类文件 C:\Users\ARIFAH\Downloads\Compressed\eUML2 免费版\带有类加载器代码\2\ 中的魔法值不兼容 1885430635 archetypedComponentWithNull\src\aC\Role/java

at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at customCL.customClassLoader.loadClass(customClassLoader.java:116)
at java.lang.ClassLoader.loadClass(Unknown Source)
at customCL.customClassLoader.main(customClassLoader.java:145)

我读过帖子说“你需要像 OSGi 这样的东西”。这类似于从头开始做一些新的事情,我想避免这种情况。

为什么会出现这个错误?

【问题讨论】:

    标签: java runtime-error classloader custom-attributes custom-component


    【解决方案1】:

    您实际上并没有加载真正的类文件。任何有效类文件的魔法值都是0xCAFEBABE,而这个十六进制魔法值是0x7061636B

    请注意,如果我们将0x7061636B 逐字节转换为 ASCII,结果是字符串“pack”。这意味着您认为是类文件的文件实际上以字符串“pack”开头。

    【讨论】:

    • 好的,所以我想我是在尝试加载包而不是类。谢谢
    • +1。请注意,*.java 文件通常以 package 声明开头。我敢打赌,他试图加载 Java 源代码而不是编译的类。 ((S)he wouldn't be alone.)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多