Java ClassFormatError:类XY中未知的常量标记

Java ClassFormatError:类XY中未知的常量标记,java,Java,我有一段代码,试图在运行时加载一个类。代码并非全部是自己编写的,因此我在理解编译后总是出现的错误时遇到了一些问题 代码如下: private Class findClass(String s) throws ClassNotFoundException { URL url = getResource("AP.class"); if(url == null) { throw new ClassNotFo

我有一段代码,试图在运行时加载一个类。代码并非全部是自己编写的,因此我在理解编译后总是出现的错误时遇到了一些问题

代码如下:

private Class findClass(String s)
        throws ClassNotFoundException
    {
        URL url = getResource("AP.class");
        if(url == null)
        {
            throw new ClassNotFoundException(s);
        }
        inputstream = null;
        Class classToRead;
        try
        {
            inputstream = url.openStream();
            byte abyte0[] = readClass(inputstream);
            classToRead= defineClass(s, abyte0, 0, abyte0.length);
        }
        catch(IOException ioexception)
        {
            throw new ClassNotFoundException(s);
        }
        if(inputstream != null)
        {
            try
            {
                inputstream.close();
            }
            catch(Exception exception1) { }
        }
        return classToRead;
    }
该错误出现在defineClass方法中

堆栈跟踪错误:

Exception in thread "main" java.lang.ClassFormatError: Unknown constant tag 63 in class file AP
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at c.findClass(c.java:100)
    at c.loadClass(c.java:56)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at c.a(c.java:20)
    at mainOpenClass.main(lol.java:13)
我现在的问题是: 代码可能有问题吗? AP.class有可能损坏吗? 这个错误到底意味着什么


我希望任何人都能帮我解决我的问题,因为在这种情况下,搜索互联网并没有真正的帮助。

回答您的问题:

  • 没有

  • 当Java虚拟机尝试 读取类文件并确定该文件的格式不正确或 否则不能解释为类文件


  • 您自己编写的代码很好。问题是
    AP.class
    是一个损坏的类文件——因此出现了
    ClassFormatError

    错误本身意味着无法正确解码常量池,常量池是类文件结构的一部分,非常类似于符号表。见:

    Java虚拟机指令不依赖于类、接口、类实例或数组的运行时布局。相反,指令引用
    常量\u池中的符号信息

    所有
    constant\u pool
    表格条目的通用格式如下:

    cp_info {
        u1 tag;
        u1 info[];
    }
    
    constant\u pool
    表中的每个项目必须以一个1字节的标签开头,指示
    cp\u信息的类型。信息数组的内容随标记的值而变化。中列出了有效标记及其值。每个标记字节后面必须有两个或多个字节,提供有关特定常量的信息。附加信息的格式因标记值而异

    因此,错误本身告诉您该类有一个带有无效标记的常量池表条目,即
    63
    。根据上面提到的表4.3进行验证,事实上,这并不符合任何记录的
    cp\u信息
    条目


    尝试重新下载
    AP.class
    。考虑到模糊的名称(
    AP
    ,以及堆栈跟踪中的
    c
    ),我将假设您试图使用一些模糊的代码。不仅要验证您试图处理的代码没有受到某种加密的进一步保护,还要验证您所做的任何预处理(例如除臭)不会损坏数据。

    当捕获到
    IOException
    时,您如何抛出
    ClassNotFoundException
    ?我认为错误不是IOException,因此稍后会捕获。好的,谢谢。这意味着如果没有AP.class的源代码,但只有文件本身,我就不可能读取该类?或者有什么方法可以“恢复”课堂?试过了。不幸的是,如果我直接反编译它,也会出现一个错误。这是因为类文件被破坏了。我假设“您试图处理的代码”是指AP.class中的代码。基于这种假设,我不确定如何检查任何加密。有没有一个简单的方法来检查?PS:谢谢你的回答!查找通常使用
    AP.class
    的代码,并查看它在定义类之前是否进行了任何预处理。它可能在加密。这就是问题所在,我没有这样的代码。这是类第一次出现在代码中。一些背景信息,这样我的问题就不会听起来非常愚蠢了。代码是一个挑战的一部分,在这个挑战中,您得到一个java程序,必须对其进行反编译并找到密码。我的假设是密码在我无法读取的类中。如果你能告诉我,我应该如何给你发zip^^@Mister004,像dropbox或puush这样的东西是没有麻烦的。