开发完成后,测试过程中,有时候会报一些莫名的异常。一般都会是:java.lang.NoClassDefFoundError、或者带有
java.lang.ClassNotFoundException。但检查发现我们需要引入的jar包确实存在,而import的类也确实存在。
根据我之前遇到的一种情况是:由于引入的第三方jar包的版本,自身是采用较高的jdk版本编译的(比如:jdk6.0),而当前
项目采用的是较低版本的jdk。为了确定import的类编译的jdk版本,可采用以下方法:
编写类:ClassVersionChecker
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/**
*
* http://www.rgagnon.com/javadetails/java-0544.html The first 4 bytes are a
* magic number, 0xCAFEBABe, to identify a valid class file then the next 2
* bytes identify the class format version (major and minor).
*
* Possible major/minor value :
*
* major minor Java platform version
*
* 45 3 1.0
*
* 45 3 1.1
*
* 46 0 1.2
*
* 47 0 1.3
*
* 48 0 1.4
*
* 49 0 1.5
*
* 50 0 1.6
*
*
* @author Administrator
*
*/
public class ClassVersionChecker {
public static void main(String[] args) throws IOException {
for (int i = 0; i < args.length; i++)
checkClassVersion(args[i]);
}
private static void checkClassVersion(String filename) throws IOException {
DataInputStream in = new DataInputStream(new FileInputStream(filename));
int magic = in.readInt();
if (magic != 0xcafebabe) {
System.out.println(filename + " is not a valid class!");
}
int minor = in.readUnsignedShort();
int major = in.readUnsignedShort();
System.out.println(filename + ": " + major + " . " + minor);
in.close();
}
}
配置args,运行main方法,可以得到该类的major和minor,参照代码注释中的表进行比对,得出编译的jdk版本。
如配置一个args[0]为:E:\workspace\whatisjava\bin\VariableBinding.class(snmp4j.jar中的一个class文件)
运行后结果为:E:\workspace\whatisjava\bin\VariableBinding.class: 48 . 0
即该类为jdk1.4编译。