JAVA獲得版本號以及位元組碼編譯版本
阿新 • • 發佈:2019-01-30
公司的開發環境比較老,尋找一些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);
//前面4個位元組CA FE BA BE 是固定的,之後2個位元組是次版本號,次版本號後面的2個位元組是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;
}
}