检查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 ...
随机推荐
- Codeforces 468D Tree
题目 给出一棵带边权的树,求一个排列\(p\),使得\(\sum_{i=1}^{n}{dis(i, p_i)}\)的值最大,其中\(dis(v, u)\)表示\(v\)到\(u\)的距离. 算法 这题 ...
- [VBS]_[活动分组程序]
场景: 1.每次搞活动都需要分组,比如20个人分3个组,如何才能更公平的分组,想到的只能是随机分组程序. 2.时间关系并没有实现男女平衡的分组,有时间的哥们可以自己实现. 文件1:分组程序.vbs,记 ...
- 正确处理Windows电源事件
简介为系统挂起与恢复而进行的应用准备步骤 曾几何时,当您正要通过应用提交或发布一些重要数据时,突然遇到一些急事需要处理,而且会耽误很长时间.当您完成任务回到电脑前时,发现电脑已经自动进入 了挂起状态, ...
- FMXUI - UI.Dialog 示例
在 FMXUI 开源库,增加了 UI.Dialog 单元.此单元实现了跨平台的基础对话框组件.使用时引用 UI.Dialog 即可.如果需要自定义对话框的样式, 可以添加一个 TDialogStyle ...
- perl use utf8
utf8 Perl编译 来启用/禁用 UTF-8(or UTF-EBCDIC) 在源代码里 简洁: use utf8; no utf8; # Convert the internal represen ...
- 基于visual Studio2013解决C语言竞赛题之1043求末尾0个数
题目 解决代码及点评 /* 43. 求n!的末尾有多少个零.可以通过检查n!含有多少个10的因数来求它末尾零的个数. 因为10=2×5,在n!中含有2的因数显然多于含有5的因数. 一 ...
- Embedded Linux Primer----嵌入式Linux基础教程--章节介绍
章节介绍 第一章,“导引”,简要介绍了Linux被迅速应用在嵌入式环境的驱动因素,介绍了与嵌入式Linux相关的几个重要的标准和组织. 第二章,“第一个嵌入式经历”,介绍了与后几章所构建的嵌入式Lin ...
- cocos2d-x 实现clash of clans多点聚焦缩放场景
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=434 都是以前写的一些效果,整理 ...
- MYSQL获取自增主键【4种方法】
通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键.本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值: 通过JDBC2.0提 ...
- 参考storm中的RotatingMap实现key超时处理
storm0.8.1以后的RotatingMap完全可以独立于storm用来实现hashmap的key超时删除,并调用回调函数 RotatingMap.java: import java.util.H ...