JAVA获得版本号以及字节码编译版本

来源:互联网 发布:东方财富网龙虎榜数据 编辑:程序博客网 时间:2024/05/01 01:43

公司的开发环境比较老,寻找一些jar包的时候总是会纠结对应的编译版本,感觉很麻烦,所以写了一个工具类用于读取class或jar文件的编译版本,供大家参考。

package com.jinggujin.util;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.util.Enumeration;import java.util.jar.JarEntry;import java.util.jar.JarFile;/** * Java 版本工具 *  * @author jianggujin * */public class JavaVersionUtils{   private static final int JAVA_CLASS_MAGIC = 0xCAFEBABE;   public final static int JDK_1_2 = 46;   public final static int JDK_1_3 = 47;   public final static int JDK_1_4 = 48;   public final static int JDK_5 = 49;   public final static int JDK_6 = 50;   public final static int JDK_7 = 51;   public final static int JDK_8 = 52;   /**    * 获得当前环境JDK版本    *     * @return    */   public static int getJDKVersion()   {      String version = System.getProperty("java.version");      if (version != null && version.matches("1\\.\\d.*"))      {         int v = Integer.parseInt(version.charAt(2) + "");         if (v >= 2)         {            return 44 + v;         }      }      return -1;   }   /**    * 获得class或jar编译版本    *     * @param file    * @return    * @throws Exception    */   public static int getCompileVersion(File file) throws Exception   {      if (file == null || !file.isFile() || !file.getName().matches(".*\\.((jar)|(class))"))      {         throw new IllegalArgumentException("the file must be a jar or class.");      }      int version = -1;      if (file.getName().endsWith("jar"))      {         JarFile jarFile = new JarFile(file);         Enumeration<JarEntry> enumeration = jarFile.entries();         while (enumeration.hasMoreElements())         {            JarEntry entry = enumeration.nextElement();            if (entry.getName().endsWith(".class"))            {               InputStream in = jarFile.getInputStream(entry);               version = getVersion(in);               in.close();               break;            }         }         jarFile.close();      }      else      {         InputStream in = new FileInputStream(file);         version = getVersion(in);         in.close();      }      return version;   }   private static int getVersion(InputStream in) throws Exception   {      DataInputStream dis = new DataInputStream(in);      // ,前面8个字节CA FE BA BE 是固定的,之后4个字节是次版本号,次版本号后面的4个字节是jdk的版本号      int magic = dis.readInt();      if (magic == JAVA_CLASS_MAGIC)      {         // int minorVersion =         dis.readUnsignedShort();         int majorVersion = dis.readUnsignedShort();         // Java 1.2 >> 46         // Java 1.3 >> 47         // Java 1.4 >> 48         // Java 5 >> 49         // Java 6 >> 50         // Java 7 >> 51         // Java 8 >> 52         return majorVersion;      }      return -1;   }}