`
xm_koma
  • 浏览: 382158 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

check class文件的jdk编译版本

    博客分类:
  • Java
 
阅读更多

开发完成后,测试过程中,有时候会报一些莫名的异常。一般都会是: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编译。

 

参考:http://www.rgagnon.com/javadetails/java-0544.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics