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有可能损坏吗?
这个错误到底意味着什么
我希望任何人都能帮我解决我的问题,因为在这种情况下,搜索互联网并没有真正的帮助。回答您的问题:
您自己编写的代码很好。问题是
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这样的东西是没有麻烦的。