检查Java的字节码能否在当前的JVM上运行

分类: /

时间:

下面这个代码片段主要用于提前检查使用高版本编译的字节码,放到低版本的Jvm上运行了。

  1. public static void main(String[] args) throws Exception {
  2. FileInputStream fin = new FileInputStream("/home/xiaochun/joor-0.9.7-iirekm/org/joor/Reflect.class");
  3. System.out.println(canRun(fin));
  4. fin.close();
  5. }
  6. /**
  7. * @param classByteStream
  8. * @throws Exception
  9. */
  10. private static double getCompileVersion(InputStream classByteStream) throws Exception {
  11. DataInputStream dataInputStream = new DataInputStream(classByteStream);
  12. if (dataInputStream.readInt() == 0xCAFEBABE) {
  13. int minorVer = dataInputStream.readUnsignedShort();
  14. int majorVer = dataInputStream.readUnsignedShort();
  15. String versionStr = majorVer + "." + minorVer;
  16. System.out.println(versionStr);
  17. return Double.valueOf(versionStr);
  18. }
  19. throw new IOException("this not a java class file");
  20. }
  21. /**
  22. * 输入一个Class文件流,检测是否可以在当前环境运行
  23. *
  24. * @param in
  25. * @return
  26. */
  27. public static boolean canRun(InputStream in) {
  28. double currentVersion = Double.valueOf(System.getProperties().getProperty("java.class.version"));
  29. try {
  30. double compileVersion = getCompileVersion(in);
  31. return currentVersion >= compileVersion;
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. return false;
  35. }
  36. }

顺便科普下对编号

版本对应的编号
Java 1.145.3
Java 1.246
Java 1.347
Java 1.448
Java 549
Java 650
Java 741
Java 852

PS : 才发现这段代码写了好久了,一直没有用上(本来打算用在zrlog-plugin对jar检查使用的,主要用来避免使用Java8开发的插件被扔到Java7上运行的),简单整理下。希望能帮到有类似需求的人。

最后更新:2016-03-12 03:50:16.0

—— 原创内容,转载请注明:[ 文章转载自:小春 ' s blog   //xiaochun.zrlog.com/ ] ——