补丁总是会一遍又一遍的打,越打越多

有时候,就担心有人不小心把高版本的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的版本号的更多相关文章

  1. 微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决

    微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决 echostr校验失败,请您检查是否正确解密并输出明文echostr 异常java.securi ...

  2. linux 下检查java jar包 程序是否正常 shell

    linux 下检查java jar包 程序是否正常 shell http://injavawetrust.iteye.com BATCH_SERVER="batch.jar" NR ...

  3. 灵魂拷问:如何检查Java数组中是否包含某个值 ?

    在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研究一下. 另外,我想要告诉大家的是, ...

  4. JAVA 软件升级版本号比较

    简单版本号比较: public class CompareVersion {   public static void main(String[] args) { // TODO Auto-gener ...

  5. 检查java 中有多少个构造函数

    检查函数中有多少个构造函数 程序设计思想: 用while来循环,并设置一个布尔类型变量c,当c是true是继续添加构造函数,当c是false是,跳出循环,程序结束.在循环体中,声明一个计数的int型变 ...

  6. java比较客户端版本号

    参考文章:http://www.jb51.net/article/70317.htm 关键点 为什么不能使用String.compareTo方法来比较客户端版本号? 举个例子,之前客户端版本号为:9. ...

  7. Java实现比较版本号

    涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法: 这就需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使 ...

  8. SDK Manager.exe和AVD Manager.exe缺失,Android SDK Tools在检查java环境时卡住了,未响应卡死!

    之前安装Android Studio的时候根据提示安装了Android SDK,但是发现目录下没有SDK Manager.exe和AVD Manager.exe,导致SDK的一些操作很不方便! 不知道 ...

  9. JS检查浏览器类型和版本号

    先取得Navigator对象的userAgent属性的小写信息,之后依据正則表達式推断赋值. var Sys = {}; var ua = navigator.userAgent.toLowerCas ...

随机推荐

  1. grunt 前端开发环境搭建

    1.找管理员开通gitlab权限 2.下载并安装git工具 3.下载并安装nodejs 4.安装cnpm 5.安装kulor-cli cnpm install -g kulor-cli cnpm in ...

  2. linux shell编程指南第二十章------向脚本传递参数

    前面已经讲到如何使用特定变量$ 1 . . $ 9向脚本传递参数.$ #用于统计传递参数的个数.可 以创建一个u s a g e语句,需要时可通知用户怎样以适当的调用参数调用脚本或函数. 简单地说,下 ...

  3. shell语法简单介绍

    一.基本的语法 1.1.shell文件开头 shell文件必须以以下的行開始(必须方在文件的第一行):  #!/bin/sh  符号#!用来告诉系统它后面的參数是用来运行该文件的程序.在这个样例中我们 ...

  4. (摘录)MSMQ的简单介绍

    MSMQ(MicroSoft  Message  Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...

  5. 浅析js的执行顺序

    javascript是一种描述型的脚本语言,是一种解析语言,由浏览器动态解析,不同种类的浏览器不同版本的浏览器对于js的解析有着微小的差别,不同浏览器的js解析引擎效率也有高低,下面来给大家分析一下j ...

  6. Qt之开机自启动

    Windows开机自启动的程序很多,包括系统软件.杀毒软件.一些其他安装软件等等.当然可以禁止,通过软件管理或者手动删除对应的注册表中的项即可!但是为了系统的服务或者操作上的方便,我们往往需要开机自启 ...

  7. [cocos2d-x]HelloWorldDemo

    实现一个demo,具备以下功能: 1.让几个字分别位于中间和四个角落. 2.中间的字体改变,并且带有闪烁功能. 3.单点触摸和多点触摸,并且能够实现滑动效果,滑动的话必须使用带有bool返回值的单点触 ...

  8. 基于visual Studio2013解决C语言竞赛题之1059最大平台

       题目 解决代码及点评 /* 功能:编写求最大平台问题的程序. 有n个整数a1,a2, ... an, 若满足a1≤a2≤ ... ≤ an , 则认为在这n个数中有最大平台.在这种情 ...

  9. javascript面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

    面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下来将为大家讲解在JS中面向对象的实现.   工厂 ...

  10. Android插件化开发---执行未安装apk中的Service

    欢迎各位增加我的Android开发群[257053751​] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...