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

	}



}


 

 

你可能感兴趣的:(Class)