check class文件的jdk编译版本

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值