【问题标题】:How to determine the Java byte code version of the current class programatically? [duplicate]如何以编程方式确定当前类的 Java 字节码版本? [复制]
【发布时间】:2009-11-10 11:00:08
【问题描述】:

我有一种情况,部署平台是 Java 5,而开发是在 Java 6 下使用 Eclipse 进行的,我们已经建立了一个在开始处理给定项目时创建新工作区的过程。因此,需要的步骤之一是将编译器级别设置为 Java 5,这经常被遗忘。

我们有一台运行部署平台的测试机器,我们可以在其中运行我们构建的代码并在我们的 PC 上进行初始测试,但如果我们忘记切换编译器级别,程序将无法运行。我们有一个构建服务器,用于创建交付给客户的内容,效果很好,但这是用于不需要构建服务器的开发,并且会增加不必要的等待。

问题是:CAN我以编程方式确定当前类的字节码版本,所以我的代码可以在本地 PC 上进行测试时打印出警告?


编辑:请注意,要求是针对当前课程的。这可以通过类加载器获得吗?还是我必须找到当前类的类文件,然后进行调查?

【问题讨论】:

  • 请注意,我们已经迁移到 maven,并且 Eclipse 的 m2e 插件根据 pom.xml 中的编译设置进行设置。不过,这仍然是一个有趣的学术问题。

标签: java introspection bytecode


【解决方案1】:

找到在类上运行 javap 的简单方法

更多详情请转至http://download.oracle.com/javase/1,5.0/docs/tooldocs/windows/javap.html

例子:

M:\Projects\Project-1\ant\javap -classpath M:\Projects\Project-1\build\WEB-INF\classes -verbose com.company.action.BaseAction

并寻找以下几行

minor version: 0
major version: 50

【讨论】:

  • 我最终这样做是为了“这些 jar 文件需要什么版本”-报告(不运行 java 程序)。
【解决方案2】:

您可以将类文件加载为resource 和parse the first eight bytes。

//TODO: error handling, stream closing, etc.
InputStream in = getClass().getClassLoader().getResourceAsStream(
    getClass().getName().replace('.', '/') + ".class");
DataInputStream data = new DataInputStream(in);
int magic = data.readInt();
if (magic != 0xCAFEBABE) {
  throw new IOException("Invalid Java class");
}
int minor = 0xFFFF & data.readShort();
int major = 0xFFFF & data.readShort();
System.out.println(major + "." + minor);

【讨论】:

  • +1 用于将字节码作为资源而不是文件的代码。
【解决方案3】:
【解决方案4】:

这里是 Java 类文件格式描述符: Java Class File Format

这里是主要版本值:

public static final int JDK14_MAJOR_VERSION = 48;

public static final int JDK15_MAJOR_VERSION = 49;

public static final int JDK16_MAJOR_VERSION = 50;

现在,用 Java 代码读取类文件并检查主版本以了解哪个 JVM 生成它

【讨论】:

    【解决方案5】:

    类文件内容的字节 5 到 8 是十六进制的版本号。您可以使用 Java 代码(或任何其他语言)来解析版本号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2010-12-08
      • 2015-07-02
      • 2011-02-18
      相关资源
      最近更新 更多