“查看 Java .class 文件版本”的版本间的差异
Jihongchang(讨论 | 贡献) |
Jihongchang(讨论 | 贡献) |
||
(未显示同一用户的11个中间版本) | |||
第1行: | 第1行: | ||
+ | === 参考 === | ||
+ | https://www.baeldung.com/java-find-class-version | ||
+ | |||
编译 Java 文件时,会生成一个 .class 文件。 | 编译 Java 文件时,会生成一个 .class 文件。 | ||
+ | |||
+ | 在某些情况下,我们需要找到编译后的类文件的 Java 发布版本。 | ||
+ | |||
+ | 每个 Java 主要版本为其生成的 .class 文件分配一个主要版本。 | ||
+ | |||
+ | 在此表中,我们将 .class 的主版本号映射到引入该类版本的 JDK 版本,并显示该版本号的十六进制表示形式: | ||
+ | {| class="wikitable" | ||
+ | !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 <syntaxhighlight lang="powershell"> | ||
+ | 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: | ||
+ | …… | ||
+ | </syntaxhighlight>其中 “major version: 52”对应上表就是 Java SE 8 | ||
+ | |||
+ | 请务必注意,此版本值并不表示该应用程序是使用相应的 JDK 构建的。 | ||
+ | |||
+ | 类文件版本可以与用于编译的 JDK 不同。 | ||
+ | |||
+ | 例如,如果我们使用 JDK11 构建代码,它应该生成版本为 55 的 .class 文件。 | ||
+ | |||
+ | 但是,如果我们在编译期间传递 “javac -target 8”,则对 .class 文件使用 javap 查看显示为“major version:52”。 | ||
+ | |||
+ | |||
+ | |||
+ | === Linux 中查看 === | ||
+ | 可以使用命令<syntaxhighlight lang="powershell"> | ||
+ | javap -verbose Sample | grep major | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === windows 中 === | ||
+ | <syntaxhighlight lang="powershell"> | ||
+ | javap -verbose Sample|findstr major | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | === 查看 .class 文件十六进制编码 === | ||
+ | 因为 .class 文件遵循一个标准:https://en.wikipedia.org/wiki/Java_class_file | ||
+ | |||
+ | 文件开头的几个字节由魔数、minor version 和 major 组成,所以也可以通过查看 .class 文件十六进制编码值的方式查看 .class 文件版本。 | ||
+ | |||
+ | 使用“Notepad++”,安装“HEX-Editor”插件之后查看 Sample.class 文件: | ||
+ | [[文件:查看 .class 文件十六进制编码1.png|无|缩略图|594x594像素]]因为是十六机制编码:0034 = 3*16+4=48+4=52 | ||
+ | |||
+ | |||
+ | === Linux 中查看 .class 文件十六进制编码 === | ||
+ | 可以使用 hexdump 工具查看 |
2023年2月1日 (三) 10:46的最新版本
参考
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 文件:
因为是十六机制编码:0034 = 3*16+4=48+4=52
Linux 中查看 .class 文件十六进制编码
可以使用 hexdump 工具查看