文章目录
- 原理分析
 - 解决方案
 - 其它解决方案
 - javap 命令行工具
 
在平时的 Java 开发中,有时候我们需要知道某个 class 文件是由哪个版本的 Java 编译器编译生成的
原理分析
class 文件,即字节码文件,它有特定的二进制格式,这种格式是由 JVM 规范规定的,不受特定硬件或操作系统的影响。
 字节码文件的二进制格式主要有如下部分:
magic number(魔数):开头4个字节,始终为CAFE BABE;version(版本号):接下来4个字节表示Java的版本。其中,前2个字节是minor version(次版本号),后2个字节是major version(主版本号);
所以,可以通过查看 class 文件的 major version 来确定其对应的编译器版本。
解决方案
实际上,任何可以查看二进制格式文件的软件(文本编辑器等),都可以帮助我们确定 class 文件对应的 Java 编译器版本。这里抛砖引玉,借助
Visual Studio Code的一款叫Hex Editor的插件来确定。
打开 Visual Studio Code,点击“插件”图标,搜索并安装插件 Hex Editor
 
 
使用 Hex Editor 打开对应的 class 文件,查看文件第一行的索引号为 06 及 07 这两个字节(这里为 00 32),得到对应的 major version
 
然后通过 Java 版本对照表,即可知道 class 文件是由哪个版本的 Java 编译器编译生成的了(比如上面示例的 class 文件对应编译器版本为 JDK 6)
| Java JDK | major version(十进制) | major version(十六进制) | 
|---|---|---|
| 18 | 62 | 0x3e | 
| 17 | 61 | 0x3d | 
| 16 | 60 | 0x3c | 
| 15 | 59 | 0x3b | 
| 14 | 58 | 0x3a | 
| 13 | 57 | 0x39 | 
| 12 | 56 | 0x38 | 
| 11 | 55 | 0x37 | 
| 10 | 54 | 0x36 | 
| 9 | 53 | 0x35 | 
| 8 | 52 | 0x34 | 
| 7 | 51 | 0x33 | 
| 6 | 50 | 0x32 | 
| 5 | 49 | 0x31 | 
| 1.4 | 48 | 0x30 | 
| 1.3 | 47 | 0x2f | 
| 1.2 | 46 | 0x2e | 
| 1.1 | 45 | 0x2d | 
其它解决方案
javap 命令行工具
javap,Java class file disassembler,Java 类文件反汇编器,它是 JDK 附带的一个命令行工具,用于反编译和显示 Java 字节码文件的详细信息,通过该工具也可以确定class文件对应的 Java 编译器版本。
javap -verbose App.class 
