如何找到已编译类的目标Java版本?

14

重复:

读取和显示Java .class文件版本的工具

如果我有一个已编译的Java类,是否有一种方法可以从只有类文件时判断其目标版本兼容性?特别是,我有一些编译为Java 6的类文件,在Java 5下运行并出现“无法识别的版本”错误。我想能够查看类文件并找到其目标版本兼容性,而不必运行JVM。有什么想法吗?


当然,如果你愿意使用终端,MacOS也包含了文件实用工具。 - kmorris
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
45

你可以使用随附在标准JDK中的javap实用程序。

javap -verbose MyClass

Compiled from “MyClass.java”
public class MyClass extends java.lang.Object
SourceFile: “MyClass.java”
minor version: 3
major version: 45

虽然它可能被认为是“更好的”,但它并不完全是我要找的。 - Mike Pone
4
在大多数GNU / unix系统上,可以使用文件程序来实现相同的结果:file Foo.class Foo.class:已编译的Java类数据,版本为45.3顺便说一句:如何进行编译以产生此输出(45.3),是0.45 jdk1.x还是j2me? - RzR
6
在Java类文件的维基百科文章中有一个主要版本号的表格(例如主要版本号51 = Java 1.7等),请参考http://en.wikipedia.org/wiki/Java_class_file#General_layout。 - rescdsk
1
可以使用“javap -version target.class”命令来转储精确的版本。 - user2149140
1
@user2149140 javap -version 报告的是 javap 的版本,而不是你的 target.class 的版本。 - Cardin

25

我在网上找到了这个方法,它可以正常工作。

每个 '.class' 文件的开头都是以下内容:

  • 魔数 [4 字节]
  • 版本信息 [4 字节]

使用以下每个选项编译的 '.class' 文件的十六进制转储结果如下:

javac -target 1.1 ==> CA FE BA BE 00 03 00 2D
javac -target 1.2 ==> CA FE BA BE 00 00 00 2E
javac -target 1.3 ==> CA FE BA BE 00 00 00 2F
javac -target 1.4 ==> CA FE BA BE 00 00 00 30

或许你可以利用这些信息来编写自己的 '.class' 文件版本检查工具,使用 Java 或其他脚本或 shell 语言 ;)!

希望这能有所帮助。

Anthony Borla

来自:http://bytes.com/groups/java/16603-how-determine-java-bytecode-version


很好,但是1.5和1.6版本呢?这些才是我关心的。 - Mike Pone
1
似乎最后一个数字代表了最终版本的十六进制值,即 hex 31 = dec 49,hex 32 = dec 50。这就是我需要的。谢谢。 - Mike Pone
3
1.6 版本等同于32,而 1.5 版本等同于31。 - Kalecser
2
我发现这里提供的答案(https://dev59.com/KXNA5IYBdhLWcg3wF5uO)更加启发人。 - Scott
5
javap -verbose MyClass => 主要版本号49(十进制)= Java 1.5,50 = Java 1.6,51 = Java 1.7,52 = Java 1.8。 - FoggyDay

5

Linux/Unix用户可以从标准工具箱中使用一个很好的工具: file实用程序。现代版本可以检测Java类文件的版本,并为已知的类文件类型输出Java版本。

示例输出:

com/sample/Tracker.class: compiled Java class data, version 45.3
com/sample/TestListener.class: compiled Java class data, version 49.0 (Java 1.5)

它非常适合标准的Unix脚本工具链。


3

来源: http://twit88.com/blog/2008/09/22/java-check-class-version/

Java是一种流行的编程语言,常用于开发企业级应用程序。在运行Java应用程序时,计算机需要有安装Java虚拟机(JVM)才能正确解释并执行Java代码。与JVM相关的一个重要概念是类版本,即Java类文件的版本。

在开发和维护Java应用程序时,了解Java类文件的版本非常重要。可以通过以下步骤检查Java类文件的版本:

1. 打开命令提示符或终端窗口。

2. 转到包含Java类文件的目录。

3. 运行以下命令:javap -verbose MyClass。

其中,“MyClass”是要检查版本的Java类文件的名称。

4. 检查输出以确定Java类文件的版本。

理解Java类文件的版本可以帮助开发人员确保他们的应用程序在不同版本的JVM上运行时具有良好的兼容性。

try {
    String filename = "C:\\MyClass.class";
    DataInputStream in = new DataInputStream(new FileInputStream(filename));
    int magic = in.readInt();
    if (magic != 0xcafebabe) {
        log.info(filename + " is not a valid class!");
    }
    int minor = in.readUnsignedShort();
    int major = in.readUnsignedShort();
    log.info(filename + ": " + major + " . " + minor);
    in.close();
} catch (IOException e) {
    log.info("Exception: " + e.getMessage(), e);
}

0

你可以查看文件中的字节偏移量6和7(可能是十六进制转储),这将告诉你使用了哪个版本。我认为Bytecode Visualizer(Eclipse插件)可以查看类文件是为哪个版本创建的。

更多阅读


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,