Ответ 1
Код не является кодом, а внутренним представлением модификаторов класса в байтовом коде вашего файла класса.
Существует восемь разных флагов.
ACC_PUBLIC (0x0001)
ACC_FINAL (0x0010)
ACC_SUPER (0x0020)
ACC_INTERFACE (0x0200)
ACC_ABSTRACT (0x0400)
ACC_SYNTHETIC (0x1000)
ACC_ANNOTATION (0x2000)
ACC_ENUM (0x4000)
Например, публичный конечный класс будет иметь байты модификатора 0x0011, открытый абстрактный класс 0x0401.
Ваш случай 0x209 (или лучше: 0x0209) является незаконным modfier. Он выглядит как интерфейс (0x0200), но часть 0x0009 не входит в спецификацию. Я бы предположил, что это ошибка компилятора.
Возможно, следующий код помогает изолировать проблему. Он читает модификаторы класса из файла класса и проверяет, поддерживает ли модификатор. Если он не печатает имя файла и INVALID!!! Возможно, вы можете использовать этот инструмент в своих файлах классов, чтобы изолировать класс, вызывающий ошибку.
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!!!");
}
}