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

}


原文地址:https://www.cnblogs.com/dyllove98/p/3151192.html