代码不是代码,而是类修饰符的内部表示形式,在类文件的字节代码中.
可以设置八个不同的标志.
ACC_PUBLIC (0x0001)
ACC_FINAL (0x0010)
ACC_SUPER (0x0020)
ACC_INTERFACE (0x0200)
ACC_ABSTRACT (0x0400)
ACC_SYNTHETIC (0x1000)
ACC_ANNOTATION (0x2000)
ACC_ENUM (0x4000)
例如,公共final类将具有修饰符字节0x0011,即公共抽象类0x0401.
你的情况0x209(或更好:0x0209)是一个非法的修改器.它看起来像一个接口(0x0200),但0x0009部分不是规范的一部分.我猜这是一个编译器错误.
也许以下代码有助于隔离问题.它从类文件中读取类修饰符,并验证修饰符是否正常.如果不是它打印文件名和无效!也许您可以在类文件上使用此工具来隔离导致错误的类.
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
String path = "D:/Arne/workspaces/IDEDeluxe/TestBytecode/bin/";
String[] fileNames = { "Main.class" };
for(String fileName : fileNames)
traceFile(path, fileName);
}
private static void traceFile(String path, String fileName) throws FileNotFoundException, IOException {
DataInputStream stream = new DataInputStream(new BufferedInputStream(new FileInputStream(path + fileName)));
trace(fileName, readClassAccessFlags(stream));
stream.close();
}
private static int readClassAccessFlags(DataInputStream stream) throws IOException {
skipHeader(stream);
skipConstantPool(stream);
return stream.readUnsignedShort();
}
private static void skipHeader(DataInputStream stream) throws IOException {
stream.readInt();
stream.readUnsignedShort();
stream.readUnsignedShort();
}
private static void skipConstantPool(DataInputStream stream) throws IOException {
int constantPoolCount = stream.readUnsignedShort();
for(int n = 1; n < constantPoolCount; n++) {
int tag = stream.readUnsignedByte();
switch(tag) {
case 7:
stream.readUnsignedShort();
break;
case 9:
case 10:
case 11:
stream.readUnsignedShort();
stream.readUnsignedShort();
break;
case 8:
stream.readUnsignedShort();
break;
case 3:
case 4:
stream.readInt();
break;
case 5:
case 6:
stream.readInt();
stream.readInt();
break;
case 12:
stream.readUnsignedShort();
stream.readUnsignedShort();
break;
case 1:
stream.readUTF();
break;
}
}
}
private static void trace(String fileName, int flags) {
System.out.print(fileName + ": " + Integer.toHexString(flags) + " - ");
if((flags & 0x0001) != 0)
flags -= 0x0001;
if((flags & 0x0010) != 0)
flags -= 0x0010;
if((flags & 0x0020) != 0)
flags -= 0x0020;
if((flags & 0x0200) != 0)
flags -= 0x0200;
if((flags & 0x0400) != 0)
flags -= 0x0400;
if((flags & 0x1000) != 0)
flags -= 0x1000;
if((flags & 0x2000) != 0)
flags -= 0x2000;
if((flags & 0x4000) != 0)
flags -= 0x4000;
if(flags == 0)
System.out.println("OK!");
else
System.out.println("INVALID!!!");
}
}