如何以编程方式确定当前类的Java字节码版本?

时间:2009-11-10 11:00:09

标签: java introspection bytecode

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

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

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


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

5 个答案:

答案 0 :(得分:10)

在课程

上轻松找到运行 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

答案 1 :(得分:7)

您可以将类文件加载为resourceparse 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);

答案 2 :(得分: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生成它

答案 3 :(得分:3)

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

答案 4 :(得分:2)