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

我有一段代码,我尝试在运行时加载一个类。 代码不是全部自写的,所以我在理解编译后总是出现的错误时遇到了一些问题。

这里的代码:

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 ca(c.java:20) at mainOpenClass.main(lol.java:13) 

我现在的问题是:代码可能有问题吗? AP.class可能已损坏吗? 这个错误究竟意味着什么?

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

你自己编写的代码很好。 问题是AP.class是一个损坏的类文件 – 因此是ClassFormatError

错误本身意味着它无法正确解码常量池 ,类文件结构的一部分非常像符号表。 请参阅Java虚拟机规范的§4.4 :

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

所有constant_pool表条目都具有以下通用格式:

 cp_info { u1 tag; u1 info[]; } 

constant_pool表中的每个项必须以1字节标记开头,表示cp_info条目的类型。 info数组的内容随tag的值而变化。 表4.3列出了有效标签及其值。 每个标记字节后面必须跟有两个或多个字节,提供有关特定常量的信息。 附加信息的格式随标签值而变化。

因此,错误本身告诉您该类具有带有无效标记的常量池表条目,即63 。 事实上,使用上面提到的表4.3进行validation, 这与任何记录的cp_info条目都不对应

尝试重新下载AP.class 。 鉴于名称模糊( AP ,以及来自堆栈跟踪的c ),我将假设您正在尝试使用一些混淆代码。 不仅要validation您尝试处理的代码不会受到某种加密的进一步保护,而且还要validation您执行的任何预处理(例如,反混淆)都不会破坏数据。

您的问题的答案:

  1. 没有

  2. 从Java Doc Throw当Java虚拟机尝试读取类文件并确定文件格式错误或无法解释为类文件时。