查看 Java .class 文件版本

来自姬鸿昌的知识库
Jihongchang讨论 | 贡献2023年2月1日 (三) 10:46的版本 →‎使用 javap 查看 .class 文件的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

参考

https://www.baeldung.com/java-find-class-version

编译 Java 文件时,会生成一个 .class 文件。

在某些情况下,我们需要找到编译后的类文件的 Java 发布版本。

每个 Java 主要版本为其生成的 .class 文件分配一个主要版本。

在此表中,我们将 .class 的主版本号映射到引入该类版本的 JDK 版本,并显示该版本号的十六进制表示形式:

Java Release Class Major Version Hex
Java SE 18 62 003e
Java SE 17 61 003d
Java SE 16 60 003c
Java SE 15 59 003b
Java SE 14 58 003a
Java SE 13 57 0039
Java SE 12 56 0038
Java SE 11 55 0037
Java SE 10 54 0036
Java SE 9 53 0035
Java SE 8 52 0034
Java SE 7 51 0033
Java SE 6 50 0032
Java SE 5 49 0031
JDK 1.4 48 0030
JDK 1.3 47 002f
JDK 1.2 46 002e
JDK 1.1 45 002d


使用 javap 查看 .class 文件的版本

比如使用 Java SE 8 编译 Sample.java 后得到的 Sample.class 文件,

用 javap 命令查看 Sample.class

C:\Users\Administrator\IdeaProjects\test-springboot\target\classes\org\example>javap -verbose Sample
警告: 二进制文件Sample包含org.example.Sample
Classfile /C:/Users/Administrator/IdeaProjects/test-springboot/target/classes/org/example/Sample.class
  Last modified 2023-2-1; size 582 bytes
  MD5 checksum 43f97b7f92af266d68d897e33e0481cf
  Compiled from "Sample.java"
public class org.example.Sample
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
……

其中 “major version: 52”对应上表就是 Java SE 8

请务必注意,此版本值并不表示该应用程序是使用相应的 JDK 构建的。

类文件版本可以与用于编译的 JDK 不同。

例如,如果我们使用 JDK11 构建代码,它应该生成版本为 55 的 .class 文件。

但是,如果我们在编译期间传递 “javac -target 8”,则对 .class 文件使用 javap 查看显示为“major version:52”。


Linux 中查看

可以使用命令

javap -verbose Sample | grep major

windows 中

javap -verbose Sample|findstr major


查看 .class 文件十六进制编码

因为 .class 文件遵循一个标准:https://en.wikipedia.org/wiki/Java_class_file

文件开头的几个字节由魔数、minor version 和 major 组成,所以也可以通过查看 .class 文件十六进制编码值的方式查看 .class 文件版本。

使用“Notepad++”,安装“HEX-Editor”插件之后查看 Sample.class 文件:

查看 .class 文件十六进制编码1.png

因为是十六机制编码:0034 = 3*16+4=48+4=52


Linux 中查看 .class 文件十六进制编码

可以使用 hexdump 工具查看