检查Java的字节码能否在当前的JVM上运行
下面这个代码片段主要用于提前检查使用高版本编译的字节码,放到低版本的Jvm上运行了。
public static void main(String[] args) throws Exception {
FileInputStream fin = new FileInputStream("/home/xiaochun/joor-0.9.7-iirekm/org/joor/Reflect.class");
System.out.println(canRun(fin));
fin.close();
}
/**
* @param classByteStream
* @throws Exception
*/
private static double getCompileVersion(InputStream classByteStream) throws Exception {
DataInputStream dataInputStream = new DataInputStream(classByteStream);
if (dataInputStream.readInt() == 0xCAFEBABE) {
int minorVer = dataInputStream.readUnsignedShort();
int majorVer = dataInputStream.readUnsignedShort();
String versionStr = majorVer + "." + minorVer;
System.out.println(versionStr);
return Double.valueOf(versionStr);
}
throw new IOException("this not a java class file");
}
/**
* 输入一个Class文件流,检测是否可以在当前环境运行
*
* @param in
* @return
*/
public static boolean canRun(InputStream in) {
double currentVersion = Double.valueOf(System.getProperties().getProperty("java.class.version"));
try {
double compileVersion = getCompileVersion(in);
return currentVersion >= compileVersion;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
顺便科普下对编号
版本 | 对应的编号 |
---|---|
Java 1.1 | 45.3 |
Java 1.2 | 46 |
Java 1.3 | 47 |
Java 1.4 | 48 |
Java 5 | 49 |
Java 6 | 50 |
Java 7 | 41 |
Java 8 | 52 |
PS : 才发现这段代码写了好久了,一直没有用上(本来打算用在zrlog-plugin对jar检查使用的,主要用来避免使用Java8开发的插件被扔到Java7上运行的),简单整理下。希望能帮到有类似需求的人。
转载请注明作者和出处,并添加本页链接。
原文链接:
//xiaochun.zrlog.com/check-java-class-file-can-run.html