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