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