我的情况是部署平台是Java 5,并且在Java 6下使用Eclipse进行开发,我们已经建立了在开始处理给定项目时创建新工作区的过程。因此,必需的步骤之一是将编译器级别设置为Java 5,这经常被遗忘。
我们有一台运行部署平台的测试机器,我们可以运行我们构建的代码并在我们的PC上进行初始测试,但是如果我们忘记切换编译器级别,程序就无法运行。我们有一个构建服务器,用于创建发送给客户的内容,但效果很好,但这适用于不需要构建服务器并且会增加不必要的等待的开发。
问题是: CAN 我以编程方式确定当前类的字节码版本,因此我的代码可以在本地PC上测试时打印出警告吗?
编辑:请注意要求是当前的课程。这可以通过classloadeer获得吗?或者我必须找到当前类的类文件,然后进行调查吗?
答案 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)
您可以将类文件加载为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);
答案 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)