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

如何找到已编译类的目标Java版本? 重复:,java,compiler-construction,Java,Compiler Construction,如果我有一个编译过的Java类,有没有一种方法可以仅仅从类文件判断它的目标版本兼容性是什么?具体地说,我有许多编译成Java6的类文件,它们在Java5下运行,并给出“Unrecognized version”错误。我希望能够在不运行JVM的情况下查看类文件并找到其目标版本兼容性。有什么想法吗?我在网上找到了这个,它很管用 每个“.class”文件都以 以下是: 幻数[4字节] 版本信息[4字节] 编译的“.class”文件的hexdump 使用以下每个选项 揭示: javac-target


如果我有一个编译过的Java类,有没有一种方法可以仅仅从类文件判断它的目标版本兼容性是什么?具体地说,我有许多编译成Java6的类文件,它们在Java5下运行,并给出“Unrecognized version”错误。我希望能够在不运行JVM的情况下查看类文件并找到其目标版本兼容性。有什么想法吗?

我在网上找到了这个,它很管用

每个“.class”文件都以 以下是:

  • 幻数[4字节]
  • 版本信息[4字节]
编译的“.class”文件的hexdump 使用以下每个选项 揭示:

javac-target 1.1
==>
CA-FE-BA-BE-00 03 00 2D

javac-目标1.2
==>
CA-FE-BA-BE-00 2E

javac-目标1.3
==>
CA-FE-BA-BE-00-2F

javac-target1.4
==>
CA-FE-BA-BE-00-30

也许你可以利用这些信息 要编写自己的“.class”文件 版本检查实用程序,使用Java, 或者可能是脚本或shell 语言;)

我希望这有帮助

安东尼·博拉


From:

您可以查看文件中的字节偏移量6和7(可能是十六进制转储),它告诉您使用的是哪个版本。我认为(eclipse插件)可以看到类文件是为哪个版本制作的


您可以使用标准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
摘自:


Linux/Unix用户有一个标准工具箱之外的好工具:实用工具。现代版本可以检测Java类fersion版本,甚至可以输出已知类文件类型的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脚本工具链。

很好,但是我关心的版本1.5和1.6呢?最后一个数字似乎代表最终版本hex 31=dec 49 hex 32=dec 50。这就是我需要的。谢谢。1.6=32,1.5是31。我发现答案稍微有点启发性。
javap-verbose MyClass
=>主要版本49(十进制)=Java 1.5,50=Java 1.6,51=Java 1.7,52=Java 1.8。虽然它可能被认为“更好”,但它并不完全是我想要的。使用文件程序可以获得相同的结果(在大多数GNU/unix系统上):文件Foo.class Foo.class:compiled Java class data,版本45.3顺便问一下:如何编译以生成此输出(45.3),是.45 jdk1.x还是j2me?上有一个主要版本号表(如主要版本51=Java 1.7等)。可以使用“javap-version target.class”转储确切的版本@user2149140
javap-version
报告的是
javap
的版本,而不是您的
target.class
…当然,如果您愿意使用终端,文件实用程序也包括在MacOS上。
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)