• 检查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);
    	}
    
    }
    


  • 相关阅读:
    考试备忘
    php代码规范
    text-indent: -999px;是什么意思
    MYSQL中的普通索引,主健,唯一,全文索引区别
    Mysql索引介绍及常见索引(主键索引、唯一索引、普通索引、全文索引、组合索引)的区别
    flush privileges是什么意思?
    大长今
    深入理解this对象
    如何将js与HTML完全脱离
    php页面相互调用的知识点
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3151192.html
Copyright © 2020-2023  润新知