Java类文件结构

三、魔数与Class文件的版本

每个Class文件的头4个字节称为魔数(Magic Number), 它唯一的作用是确定这个文件是否为一个能被虚拟机接受的Class文件. 很多文件存储标准中都使用魔数来进行身份识别, 譬如图片格式 ,如 gif或者 jpeg等在文件头中都存有魔数. 使用魔数而不是扩展名来进行识别主要是基于安全方面的考虑, 因为文件扩展名可以随意地必去. 文件格式的制定者可以自由地选择魔数值, 只要这个魔数值还没有被广泛采用过同时又不会引起混淆即可. Class文件的魔数的获得很有浪漫气息. 值为0xCAFEBABE(咖啡宝贝?) 这个魔数值在Java还称做”Oak”语言的时候(大约是1991年前后)就已经确定下来了.

紧接着魔数的4个字节存储的是Class文件的版本号: 第5和第6个字节是次版本号(minor version), 第7和第8个字节是主版本号(Major Version). Java的版本号是从45开始的, JDK1.1之后的每个JDK大版本发布主版本号向上加1(JDK1.0 ~_1.1 使用了45.0 ~ 45.3的版本号), 高版本的JDK能向下兼容以前版本的Class文件, 但不能运行以后版本的Class文件,即使文件格式并未发生任何变化, 虚拟机也必须拒绝执行超过其版本号的Class文件.

例如, JDK1.1能支持的版本号为45.0~45.65535的Class文件. 无法执行版本号为46.0以上的Class文件,而JDK1.2则能支持45.0-46.65535的Class文件. 较新的JDK版本为1.7, 可生成的Class文件主版本号最大值为51.0.