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

时间:2009-03-30 17:13:48

标签: java compiler-construction

重复:

  

Tool to read and display Java .class versions

如果我有一个已编译的Java类,有没有办法告诉类文件它的目标版本兼容性是什么?具体来说,我有许多编译为Java 6的类文件,它们在Java 5下运行并给出“无法识别的版本”错误。我希望能够在不运行JVM的情况下查看类文件并找到其目标版本兼容性。有什么想法吗?

5 个答案:

答案 0 :(得分:37)

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

答案 1 :(得分:23)

我在网上发现了这个并且有效。

  

每个'.class'文件都以   以下内容:

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

编译了'.class'文件的hexdump   使用以下每个选项   揭示了:

     

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

答案 2 :(得分: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 :(得分:3)

取自:http://twit88.com/blog/2008/09/22/java-check-class-version/

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);
}

答案 4 :(得分:0)

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

Further reading