java获取版本号及字节码编译版本方法示例
作者:蒋固金 发布时间:2023-06-22 08:44:31
标签: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 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;
}
}
来源:http://blog.csdn.net/jianggujin/article/details/72899368


猜你喜欢
- 在5.2.1节和5.2.2节介绍了<a>标签以及TextView自动识别的特殊文本(网址、电话号、Email等),这些都可以通过
- 一、背景介绍在微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLCo
- Android内部没有控件来直接显示文档,跳转WPS或其他第三方文档App体验性不好,使用腾讯X5内核能很好的解决的这一问题。一、下载腾讯X
- 本文实例讲述了C#遍历系统进程的方法。分享给大家供大家参考。具体实现方法如下:建立一个listBox将进程名称遍历进去this.listBo
- 前言业务开发中搜索框和列表的组合页面应该是比较常见的场景,那么有什么坑呢?最近在开发过程就遇到了一个问题,输入搜索关键词查询接口返回数据后,
- 本文实例为大家分享了C#重写DataGridView的实例代码,供大家参考,具体内容如下using System;using S
- 实例如下所示:public class MainActivity {private static final String fileName
- 小米系统自带的长截屏应该很多人都用过,效果不错。当长截屏时listview就会自动滚动,当按下停止截屏时,就会得到一张完整的截屏。该篇就介绍
- PC上的浏览器会弹出证书错误的对话框,提示你是否要无视错误继续浏览。实际上在WebView里也可以这样做,以实现加载证书有问题的页面。Web
- 首先给大家来讲一个我们遇到的一个奇怪的问题:1.我的一个springboot项目,用mvn install打包成jar,换一台有jdk的机器
- 1.关于JSR-303JSR-303规范(Bean Validation规范)提供了对 Java EE 和 Java SE 中的 Java
- 简介一个APP如果没有页面跳转那么是没有灵魂的,页面跳转的一个常用说法就是Navigator,flutter作为一个最为优秀的前端框架,Na
- 什么是异步?为什么要用它?异步编程提供了一个非阻塞的,事件驱动的编程模型。 这种编程模型利用系统中多核执行任务来提供并行,因此提供了应用的吞
- Springboot 内置tomcat禁止不安全HTTP方法1、在tomcat的web.xml中可以配置如下内容让tomcat禁止不安全的H
- 前言附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加
- 前言Eureka是一种基于REST(具像状态传输)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移。本文记录一个简
- 在Android开发当中,经常需要用到定位功能,尤其是依赖于地理位置功能的应用,本文介绍了Android通过原生APi获取所在位置的经纬度,
- 简介本文主要介绍如何使用java代码利用Selenium操作浏览器,某些网页元素加载慢,如何操作元素就会把找不到元素的异常,此时需要设置元素
- 1.kotlin的字符串操作和Java有些不同,有些新增。1)先看字符串比较java中==比较的是变量的引用是否指向同一个地址,Kotlin
- 当我们的软件启动的时候,计算机会分配进程给到我们运行的程序,在进程中包含多个线程用于提高软件运行速度。在android网络请求中,我们知道在