文章目录
- 原理分析
- 解决方案
- 其它解决方案
- 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




















