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

重复:

用于读取和显示Java .class版本的工具

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

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

每个’.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语言;)!

我希望这有帮助。

安东尼博拉

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

您可以使用标准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用户在标准工具箱中有一个很好的工具: 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脚本工具链。

摘自: 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); } 

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

进一步阅读