我有一段代码,我尝试在运行时加载一个类。代码不是全部自写的,所以我在理解编译后总会出现的错误时会遇到一些问题。
这里是代码:
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可能已损坏吗? 这个错误究竟意味着什么?
我希望任何人都可以帮助我解决我的问题,因为在这种情况下搜索互联网并没有真正帮助。
答案 0 :(得分:10)
你自己编写的代码很好。问题是AP.class
是一个损坏的类文件 - 因此是ClassFormatError
。
错误本身意味着它无法正确解码常量池,这是类文件结构的一部分,非常类似于符号表。见§4.4 of the Java Virtual Machine Specification:
Java虚拟机指令不依赖于类,接口,类实例或数组的运行时布局。相反,指令引用
constant_pool
表中的符号信息。所有
constant_pool
表条目都具有以下一般格式:cp_info { u1 tag; u1 info[]; }
constant_pool
表中的每个项目都必须以1字节标记开头,表示cp_info
条目的类型。 info数组的内容随tag的值而变化。有效标记及其值列在Table 4.3中。每个标记字节后面必须跟有两个或多个字节,提供有关特定常量的信息。附加信息的格式因标签值而异。
因此,错误本身告诉您该类具有带有无效标记的常量池表条目,即63
。确认上面提到的表4.3,确实这与任何记录的cp_info
条目都不对应。
尝试重新下载AP.class
。鉴于模糊名称(AP
以及堆栈跟踪中的c
),我将假设您正在尝试使用某些混淆代码。不仅要验证您尝试处理的代码是否受到某种加密的进一步保护,而且还要验证您所做的任何预处理(例如反混淆)都不会破坏数据。
答案 1 :(得分:0)
您的问题的答案:
没有
是
From Java Doc在Java虚拟机尝试时抛出 读取类文件并确定文件格式错误或 否则不能解释为类文件。