每个Class文件的头4个字节称为魔数(Magic Number),他的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。很多文件存储标准中都使用魔数来进行身份识别,譬如图片格式,如gif或者jpeg等在文件头中都存有魔数。使用魔数而不是扩展名来进行识别主要是基于安全方式的考虑,因为文件扩展名可以随意的改动。文件格式的制定者可以自由的选择魔数值,只要这个魔数值还没有被广泛采用过同时又不会引起混淆即可。Class文件的魔数的获得很有“浪漫气息”,值为:0xCAFEBABE(咖啡宝贝?),这个魔数值在Java还称作“Oak”语言的时候(大约是1991年前后)就已经确定下来了。他还有一段很有趣的历史,据Java开发小组最初的关键成员Patrick Naughton所说:“我们一直在寻找一些好玩的、容易记忆的东西,选择0xCAFEBABE是因为他象征着著名咖啡品牌Peet's Coffee中深受欢迎的Baristas咖啡”,这个魔数似乎也预示着日后“Java”这个商标名称的出现。
紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节是次版本号(Minor Version),第7和第8个字节是主版本号(Major Version)。Java的版本号是从45开始的,JDK 1.1之后的每个JDK大版本发布主版本号向上加1(JDK 1.0~1.1使用了45.0~45.3的版本号),高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,即使文件格式并未发生任何变化,虚拟机也必须拒绝执行超过其版本号的Class文件。
例如,JDK 1.1能支持版本号为45.0~45.65535的Class文件,无法执行版本号为46.0以上的Class文件,而JDK 1.2则能支持45.0~45.65535的Class文件。现在,最新的JDK版本为1.7,可生成的Class文件主版本号最大值为51.0。
下面是一段简单的Java代码。
public class TestClass {
private int m;
public int inc() {
return m + 1;
}
}
下图显示的是使用十六进制编辑器WinHex打开这个Class文件的结果,可以清楚的看见开头4个字节的十六进制表示是0xCAFFBABE,代表次版本号的第5个和第6个字节值为0x0000,而主版本号的值为0x0032,也即是十进制的50,该版本号说明这个文件是可以被JDK 1.6或以上版本虚拟机执行的Class文件。