概念:
1、魔数(magic)
用于标识文件是否为class文件,由4个字节构成,必须为:0xCAFEBABE
2、版本号(version)
4个字节,前两个字节为次版本号,后两个字节为主版本号,且都是高位在前,低位在后。
class文件的前8个字节为:magic+minor_version+major_version, 以16进制表示,两位构成一个字节。
具体代码:
private static final String filePath = "e:/Test.class";
public static void main(String args[]) {
try {
// 读取class文件,filePath为文件路径
FileInputStream fis = new FileInputStream(filePath);
int length = fis.available();
byte[] data = new byte[length];
// 读取文件到字节数组
fis.read(data);
// 关闭文件
fis.close();
// 解析文件数据
parseFile(data);
} catch (Exception e) {
System.out.println(e);
}
}
private static void parseFile(byte[] data) {
// 输出魔数
System.out.println("参考值:");
System.out.println("魔数:0xCAFEBABE");
System.out.println("版本号:49.0=5.0,50.0=6.0,46.0=1.4,45.3=1.3");
System.out.println("该文件信息:");
System.out.print("魔数:0x");
System.out.print(Integer.toHexString(data[0]).substring(6)
.toUpperCase()
+ Integer.toHexString(data[1]).substring(6).toUpperCase()
+ Integer.toHexString(data[2]).substring(6).toUpperCase()
+ Integer.toHexString(data[3]).substring(6).toUpperCase());
// 次版本号
int minor_version = (((int) data[4]) << 8) + data[5];
// 主版本号
int major_version = (((int) data[6]) << 8) + data[7];
System.out.println(" 版本号:" + major_version + "." + minor_version);
}
/**
* Integer范围(长度为32位):-2^31——(2^31-1); 负数,计算机存储补码,绝对值的2进制,取反,加1
*
*/