java获取版本号及字节码编译版本方法示例

网友投稿 361 2023-03-26


java获取版本号及字节码编译版本方法示例

前言

之所以会有这篇文章,是因为公司的开发环境比较老,寻找一些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 JgOTIifSDK_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 (versihttp://on != 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 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;

}

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅谈多线程_让程序更高效的运行
下一篇:java基于ConcurrentHashMap设计细粒度实现代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~