“查看 Java .class 文件版本”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
(建立内容为“1”的新页面)
 
 
(未显示同一用户的12个中间版本)
第1行: 第1行:
1
+
=== 参考 ===
 +
https://www.baeldung.com/java-find-class-version
 +
 
 +
编译 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 文件:

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

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


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

可以使用 hexdump 工具查看