2009-11-10 76 views
3

我有一种情况,其中部署平台是Java 5,并且开发发生在Java 6下的Eclipse中,其中我们已经建立了在开始处理给定项目时创建新工作空间的过程。因此,所需的步骤之一是将编译器级别设置为经常被遗忘的Java 5。如何以编程方式确定当前类的Java字节码版本?

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

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


编辑:请注意需求是为当前类。这是通过课程开发者提供的吗?或者我必须找到当前课程的类文件,然后调查?

+0

需要注意的是,我们因为迁移到Maven和Eclipse的插件M2E设置这个根据POM中的编译设置。不过,这仍然是一个有趣的学术问题。 – 2013-03-01 07:54:09

回答

3

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

6

你可以加载类文件作为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); 
+0

+1代码获取字节码作为资源,而不是文件。 – 2009-11-19 12:27:26

4

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

,这里的主要版本值:

公共静态最终诠释JDK14_MAJOR_VERSION = 48;

公共静态最终诠释JDK15_MAJOR_VERSION = 49;

公共静态最终诠释JDK16_MAJOR_VERSION = 50;

现在,阅读与Java代码的类文件,并检查主要版本知道哪个JVM产生它

7

简单的方法来找到这个上运行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 
+0

我最终这样做了“这些jar文件需要什么版本”--report(不运行java程序)。 – 2013-03-01 07:55:36

相关问题