检查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