检查java class的版本号 (一)

2014-11-24 10:33:30 · 作者: · 浏览: 2

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

有时候,就担心有人不小心把高版本的class打到低版本jre运行的环境中

简单写了点代码,检查文件夹中class的版本号


[java]
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.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";
}
}

}

[java]
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> versionMap = bcvc.getDirectoryClassVersionInfo(new File("D:/test"));
for (String version : versionMap.keySet()){
System.out.println("version:" + version);
List list = versionMap.get(version);
for (String file : list){
System.out.println(file);
}
}
} catch (Exception e) {
e.printStackTrace();
}

}

//保存文件夹中的class文件版本信息
//key是版本号
//value是对应文件的绝对路径
private HashMap> classVersionInfoMap;

/**
* 获取文件夹中class类的版本信息
* @param dir
* @return
* @throws Exception
*/
public HashMap> getDirectoryClassVersionInfo(File dir) throws Exception{