检查java class的版本号
补丁总是会一遍又一遍的打,越打越多
有时候,就担心有人不小心把高版本的class打到低版本jre运行的环境中
简单写了点代码,检查文件夹中class的版本号
package org.wee.cv; import java.io.File;
import java.io.FileInputStream; public class ClassVersion { /**
* 检查class文件的版本号
* @param classFile
* @return
* 返回值为:JDK1.4 JDK1.5 ... 或者unknown
* @throws Exception
*/
public static String checkClassVersion(File classFile) throws Exception{
byte[] data = new byte[8]; FileInputStream in = new FileInputStream(classFile);
//读取文件前8字节
//实际上版本号写在第4-7字节上(从第0字节开始算)
in.read(data, 0, 8);
in.close(); //计算出class文件的主次版本号
int minor_version = (((int)data[4])<<8)+data[5];
int major_version = (((int)data[6])<<8)+data[7];
return translateVersionToJDK(major_version);
} /**
* 根据主版本号,转换成JDK版本
* 48是JDK1.4,49是JDK1.5,依次类推
* @param major_version
* @return
*/
public static String translateVersionToJDK(final int major_version){
switch(major_version){
case 48:
return "JDK1.4";
case 49:
return "JDK1.5";
case 50:
return "JDK1.6";
case 51:
return "JDK1.7";
default:
return "unknown";
}
} }
package org.wee.cv; import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; public class BatchClassVersionCheck { public static void main(String[] args) {
try {
BatchClassVersionCheck bcvc = new BatchClassVersionCheck();
HashMap<String,List<String>> versionMap = bcvc.getDirectoryClassVersionInfo(new File("D:/test"));
for (String version : versionMap.keySet()){
System.out.println("version:" + version);
List<String> list = versionMap.get(version);
for (String file : list){
System.out.println(file);
}
}
} catch (Exception e) {
e.printStackTrace();
} } //保存文件夹中的class文件版本信息
//key是版本号
//value是对应文件的绝对路径
private HashMap<String,List<String>> classVersionInfoMap; /**
* 获取文件夹中class类的版本信息
* @param dir
* @return
* @throws Exception
*/
public HashMap<String,List<String>> getDirectoryClassVersionInfo(File dir) throws Exception{
classVersionInfoMap = new HashMap<String,List<String>>();
searchClass(dir);
return classVersionInfoMap;
} /**
* 递归方法
* 搜索当前文件夹下的class文件,并计算版本信息,保存在map中
* 当搜索到文件夹时,递归搜索
* @param dir
* @throws Exception
*/
protected void searchClass(File dir) throws Exception{
File[] childFiles = dir.listFiles();
for (File childFile : childFiles){
if (childFile.isDirectory()){
//递归搜索子文件夹
searchClass(childFile);
} else{
if (childFile.getName().toLowerCase().endsWith(".class")){
//搜索出class文件
//将版本信息记录在map中
putVersionInfo(ClassVersion.checkClassVersion(childFile), childFile.getAbsolutePath());
}
}
}
} /**
* 将版本信息记录在map中
* @param version
* @param absolutePath
*/
private void putVersionInfo(String version,String absolutePath){
List<String> list = null;
if (classVersionInfoMap.containsKey(version)){
list = classVersionInfoMap.get(version);
} else{
list = new ArrayList<String>();
}
list.add(absolutePath);
classVersionInfoMap.put(version, list);
} }
检查java class的版本号的更多相关文章
- 微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决
微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决 echostr校验失败,请您检查是否正确解密并输出明文echostr 异常java.securi ...
- linux 下检查java jar包 程序是否正常 shell
linux 下检查java jar包 程序是否正常 shell http://injavawetrust.iteye.com BATCH_SERVER="batch.jar" NR ...
- 灵魂拷问:如何检查Java数组中是否包含某个值 ?
在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研究一下. 另外,我想要告诉大家的是, ...
- JAVA 软件升级版本号比较
简单版本号比较: public class CompareVersion { public static void main(String[] args) { // TODO Auto-gener ...
- 检查java 中有多少个构造函数
检查函数中有多少个构造函数 程序设计思想: 用while来循环,并设置一个布尔类型变量c,当c是true是继续添加构造函数,当c是false是,跳出循环,程序结束.在循环体中,声明一个计数的int型变 ...
- java比较客户端版本号
参考文章:http://www.jb51.net/article/70317.htm 关键点 为什么不能使用String.compareTo方法来比较客户端版本号? 举个例子,之前客户端版本号为:9. ...
- Java实现比较版本号
涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法: 这就需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使 ...
- SDK Manager.exe和AVD Manager.exe缺失,Android SDK Tools在检查java环境时卡住了,未响应卡死!
之前安装Android Studio的时候根据提示安装了Android SDK,但是发现目录下没有SDK Manager.exe和AVD Manager.exe,导致SDK的一些操作很不方便! 不知道 ...
- JS检查浏览器类型和版本号
先取得Navigator对象的userAgent属性的小写信息,之后依据正則表達式推断赋值. var Sys = {}; var ua = navigator.userAgent.toLowerCas ...
随机推荐
- 一步一步重写 CodeIgniter 框架 (4) —— load_class 管理多个对象实例的思路
我们使用CodeIgniter 框架最主要是想利用其 MVC 特性,将模型.视图分开,并通过控制器进行统一控制.在尝试实现 MVC 模式之前,我们将实现其中一个对程序结构非常有用的技巧,就是 load ...
- 梳理一下uboot是如何从nandflash挂载文件系统的
只是找到了比较一点点的线索, 如下: 首先要有的概念是,内核在挂载文件系统之前,自己会做一个虚拟fs. 1. Uboot:从flash启动set bootcmd nand read 0x3000000 ...
- javascript笔记整理(数据类型强制/隐式转换 )
A.数据类型强制转换 1.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 var a=false;alert(Number(a)); ...
- jquery Deferred使用经验
这周做了个小活动(http://aoqi.100bt.com/zt-2016duanzi/index.html),刚开始时候没看好需求,逻辑都写一块了 最后各种坑要填补,从中也获取了些经验和教训,下面 ...
- WCF技术剖析之十六:数据契约的等效性和版本控制
原文:WCF技术剖析之十六:数据契约的等效性和版本控制 数据契约是对用于交换的数据结构的描述,是数据序列化和反序列化的依据.在一个WCF应用中,客户端和服务端必须通过等效的数据契约方能进行有效的数据交 ...
- ajax动态加载的图标
http://www.ajaxload.info/ 这个网站可以动态生成ajax加载样式的小图片,git格式,挺不错推荐给大家
- 基于visual Studio2013解决C语言竞赛题之1043求末尾0个数
题目 解决代码及点评 /* 43. 求n!的末尾有多少个零.可以通过检查n!含有多少个10的因数来求它末尾零的个数. 因为10=2×5,在n!中含有2的因数显然多于含有5的因数. 一 ...
- 执行shell脚本提示“syntax error near unexpected token for((i=0;i<$length;i++))”
sh脚本例如以下: #!/usr/bin/env bash county="3 4 5 6 7 8 9 10 11 12 16 29 39 44 53 62 72 84 97 115 128 ...
- EasyUI - DataGrid 组建 - [ 删除,修改 ]
效果: html代码: <div style="padding-top: 50px; width: 800px; margin: 0 auto;"> <!--使用 ...
- 编写自定义的JDBC框架与策略模式
本篇根据上一篇利用数据库的几种元数据来仿造Apache公司的开源DbUtils工具类集合来编写自己的JDBC框架.也就是说在本篇中很大程度上的代码都和DbUtils中相似,学完本篇后即更容易了解DbU ...