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

Tho*_*sen 4 java bytecode introspection

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

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

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


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

小智 12

很容易找到这个在课堂上运行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
Run Code Online (Sandbox Code Playgroud)

并寻找以下几行

minor version: 0
major version: 50
Run Code Online (Sandbox Code Playgroud)


McD*_*ell 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);
Run Code Online (Sandbox Code Playgroud)