zoukankan      html  css  js  c++  java
  • 检查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);
    	}
    
    }
    


  • 相关阅读:
    有几个控件的操作时有关联关系,一个对话框中有多组这样的控件群,各个组中的控件的消息响应处理非常类似,以下提供解决方案
    Visual Studio DSL 入门 1 什么是特定领域开发和DSL
    ★软件架构DSL领域特定语言初探[
    人生如棋胜似棋
    成功女性处世十大秘诀
    职场丽人应具备十二种经典姿态
    程序员真实写真:35岁前成功的12条黄金法则 (转)
    思雨如思君(七言)
    站在2006的边缘
    不得不学的创业“八忌”
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3151192.html
Copyright © 2011-2022 走看看