5

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

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

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


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

4

5 回答 5

15

找到这个在类上运行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
于 2011-11-01T18:11:42.247 回答
7

您可以将类文件作为资源加载并解析前八个字节

//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);
于 2009-11-10T11:11:30.753 回答
3

这是 Java 类文件格式描述符: Java 类文件格式

这里是主要版本值:

公共静态最终 int JDK14_MAJOR_VERSION = 48;

公共静态最终 int JDK15_MAJOR_VERSION = 49;

公共静态最终 int JDK16_MAJOR_VERSION = 50;

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

于 2009-11-10T11:12:00.833 回答
3

看一下问题:Java API 找出编译类文件的 JDK 版本?

于 2009-11-10T11:12:05.817 回答
2

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

于 2009-11-10T11:10:36.193 回答