如何查看class文件jdk版本的jdk版本

8223人阅读
Java(56)
FROM :/monkeyhoop/blog/item/d215dcecb59f.html
使用 UE 打开 class 文件,第一行内容:
h: CA FE BA BE <font color="#ff 00 32 00 A9 07 00 02 01 00 37 ; 漱壕...2.?....7
前四个字节为固定的 CA FE BA BE ,接下来的四个字节为次版本号(0000)和主版本号(00032)。
32:JDK1.6
31:JDK1.5
30:JDK1.4
2F:JDK1.3
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:565942次
积分:5548
积分:5548
排名:第4468名
原创:120篇
转载:40篇
评论:61条
(3)(2)(1)(2)(2)(2)(2)(2)(2)(1)(1)(2)(4)(12)(3)(15)(1)(7)(6)(13)(6)(11)(3)(6)(14)(4)(11)(26)check class文件的jdk编译版本 -
- ITeye技术网站
博客分类:
开发完成后,测试过程中,有时候会报一些莫名的异常。一般都会是:java.lang.NoClassDefFoundError、或者带有
java.lang.ClassNotFoundException。但检查发现我们需要引入的jar包确实存在,而import的类也确实存在。
根据我之前遇到的一种情况是:由于引入的第三方jar包的版本,自身是采用较高的jdk版本编译的(比如:jdk6.0),而当前
项目采用的是较低版本的jdk。为了确定import的类编译的jdk版本,可采用以下方法:
编写类:ClassVersionChecker
import java.io.DataInputS
import java.io.FileInputS
import java.io.IOE
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. 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编译。
浏览: 245085 次
来自: 上海
有没有什么办法可以一次解决整个项目中的第三方jar包的源码问题 ...
很好的教程,学习了。但是请问在mysql中建function, ...
吊!!!!!
感谢, 一起学习.君,已阅读到文档的结尾了呢~~
查看java类版本 本文档属于精品文档、课件类技术资料,转载请联系作者
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
查看java类版本
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口Java 类文件(.class)结构查看器 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 22时,
源码项目(JavaClassViewer.src.zip)请使用
6.5 或者更新版本打开。
代码片段(5)
1.&[图片] 工具屏幕截图&&&&
2.&[代码][Java]代码&&&&
// ArticleCodeDemo.src.zip - org.freeinternals.demo.jCFL_CodeDemo.printClassFile()
// Minor & Major version
MinorVersion minorVersion = classfile.getMinorVersion();
System.out.println("Class File Minor Version: " + minorVersion.getValue());
MajorVersion majorVersion = classfile.getMajorVersion();
System.out.println("Class File Major Version: " + majorVersion.getValue());
// Constant Pool
CPCount cpCount = classfile.getCPCount();
System.out.println("Constant Pool size: " + cpCount.getValue());
AbstractCPInfo[] cpArray = classfile.getConstantPool();
for (int i = 1; i & cpCount.getValue(); i++) {
System.out.println(
String.format("Constant Pool [%d]: %s", i, classfile.getCPDescription(i)));
short tag = cpArray[i].getTag();
if ((tag == AbstractCPInfo.CONSTANT_Double) ||
(tag == AbstractCPInfo.CONSTANT_Long)) {
// Access flag, this & super class
AccessFlags accessFlags = classfile.getAccessFlags();
System.out.println("Class Modifier: " + accessFlags.getModifiers());
ThisClass thisClass = classfile.getThisClass();
System.out.println("This Class Name Index: " + thisClass.getValue());
System.out.println("This Class Name: " +
classfile.getCPDescription(thisClass.getValue()));
SuperClass superClass = classfile.getSuperClass();
System.out.println("Super Class Name Index: " + superClass.getValue());
if (superClass.getValue() == 0) {
System.out.println("Super Class Name: java.lang.Object");
System.out.println("Super Class Name: " +
classfile.getCPDescription(superClass.getValue()));
// Interfaces
InterfaceCount interfactCount = classfile.getInterfacesCount();
System.out.println("Interface Count: " + interfactCount.getValue());
if (interfactCount.getValue() & 0) {
Interface[] interfaceArray = classfile.getInterfaces();
for (int i = 0; i & interfaceArray. i++) {
System.out.println(
String.format("Interface [%d] Name Index: %d", i,
interfaceArray[i].getValue()));
System.out.println(
String.format("Interface [%d] Name: %s", i,
classfile.getCPDescription(interfaceArray[i].getValue())));
FieldCount fieldCount = classfile.getFieldCount();
System.out.println("Field count: " + fieldCount.getValue());
if (fieldCount.getValue() & 0) {
FieldInfo[] fieldArray = classfile.getFields();
for (int i = 0; i & fieldArray. i++) {
System.out.println(String.format("Field [%d]: %s", i,
fieldArray[i].getDeclaration()));
// Methods
MethodCount methodCount = classfile.getMethodCount();
System.out.println("Method count: " + methodCount.getValue());
if (methodCount.getValue() & 0) {
MethodInfo[] methodArray = classfile.getMethods();
for (int i = 0; i & methodArray. i++) {
System.out.println(String.format("Method [%d]: %s", i,
methodArray[i].getDeclaration()));
// Attributes
AttributeCount attributeCount = classfile.getAttributeCount();
System.out.println("Attribute count: " + attributeCount.getValue());
AttributeInfo[] attributeArray = classfile.getAttributes();
for (int i = 0; i & attributeArray. i++) {
System.out.println(String.format("Attribute [%d]: %s", i,
attributeArray[i].getName()));
JavaClassViewer.binary.zip&~&74KB&&&&
JavaClassViewer.src.zip&~&44KB&&&&
ArticleCodeDemo.src.zip&~&88KB&&&&
开源中国-程序员在线工具:
好,想找很久了
2楼:三宝潜行 发表于
谢谢,不过我有点不会用。。。。。
3楼:小梧桐 发表于
如何用啊?
4楼:Turbidsoul 发表于
javap貌似就是这个功能吧,不过是命令行下的
5楼:九路 发表于
这怎么用啊
开源从代码分享开始
红薯的其它代码Java Class文件是什么?认识java的Class类教程
&&#65279;&#65279;Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short, int, long, float 和 double) 和 void 类型也可表示为 Class 对象。
一,class类有什么用?
&& class类的实例表示java应用运行时的类(class ans enum)或接口(interface and annotation)(每个java类运行时都在JVM里表现为一个class对象,可通过类名.class,类型.getClass(),Class.forName(&类名&)等方法获取class对象)。数组同样也被映射为为class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本类型boolean,byte,char,short,int,long,float,double和关键字void同样表现为&class& 对象。
二,class类的特征
&&& class类没有公有的构造方法,它由JVM自动调用(在new对象或者加载-classLoader时)。
&&& 下面的方法作用是打印出对象的class name:
&void printClassName(Object obj) {
&&&&&&&& System.out.println(&The class of & + obj +
&&&&&&&&&&&&&&&&&&&&&&&&&&& & is & + obj.getClass().getName());
&& }
& 同样可以根据class literal 获得class name:
& System.out.println(&The name of class Foo is: &+Foo.class.getName());//你可以将Foo改为void尝试下。
三,class的主要方法
class类的方法还是挺多的。主要是用于得到运行时类的相关信息(可用于反射)。
& 重要的几个方法:
1, public static Class&?& forName(String className) :natice 方法,动态加载类。非常重要。
&&&&&& 如在sql中动态加载驱动程序:class.forName(sqlDriver);
2,public T newInstance() :根据对象的class新建一个对象,用于反射。非常重要。
&&&&&& 可用在反射中构建对象,调用对象方法:
&&&&&& class doubleClass= class.forName(&java.lang.Double&);
&&&&&&&Object objDouble = doubleClass.newInstance();
&&&&&& 如在javaBean中就应用了这个方法,因为java默认要有一个无参构造函数。
3, public ClassLoader getClassLoader() :获得类的类加载器Bootstrap& ,Extension ,System or user custom&&&&& ClassLoader(一般为system classloader)。重要。
4,public String getName() :获取类或接口的名字。记住enum为类,annotation为接口。重要
5,public native Class getSuperclass():获取类的父类,继承了父类则返回父类,否则返回java.lang.Object。返回Object的父类为空-null。一般
6,public java.net.URL getResource(String name) :根据字符串获得资源。
7,其他类&
&public boolean isEnum() :判断是否为枚举类型。
&public native boolean isArray() :判断是否为数组类型。
&public native boolean isPrimitive() :判断是否为基本类型。
&public boolean isAnnotation() :判断是否为注解类型。
public Package getPackage() :反射中获得package,如java.lang.Object 的package为java.lang。
public native int getModifiers()&: 反射中获得修饰符,如public static void等 。
public Field getField(String name):反射中获得域成员。
public Field[] getFields() :获得域数组成员。&&&&
public Method[] getMethods() :获得方法。
public Method getDeclaredMethod(String name, Class&?&... parameterTypes):加个Declared代表本类,继承,父类均不包括。
public Constructor&?&[] getConstructors() :获得所有的构造函数。
如此我们可以知道反射可以运行时动态获得类的所有信息,并新建对象(newInstance()方法)。
Class文件中包含以下信息:
[+]view code
1. 通过实例来看
[+]view code
2. 魔数
作用:确定该文件是否是虚拟机可接受的class文件。java的魔数统一为 0xCAFEBABE (来源于一款咖啡)。
区域:文件第0~3字节。
3. 版本号
作用:表示class文件的版本,由minorversion和majorversion组成。
区域:文件第4~7字节。

51代表,jdk为1.7.0
需要注意的是java版本号是从45开始的,大版本发布,主版本号+1.高版本的jdk能向下兼容以前版本的class文件,但不兼容以后版本的class文件。
4. 常量池
常量池的大小是不固定的,根据你的类中的常量的多少而定,所以在常量池的入口,放置了一个u2类型的表示常量池中常量个数的常量池容量计数器。计数器从1开始,第0位有特殊含义,表示指向常量池的索引值数据不引用任何一个常量池项目。池中的数据项就像数组一样是通过索引访问的。
我们可以清楚的看到,我们常量池中有63-1=62个常量。这些常量是什么呢?
要存放字面量Literal和符号引用Symbolic References。
字面量可能是文本字符串,或final的常量值。
符号引用包括以下:
类或接口全限定名 Full Qualified Name
字段名称和描述符 Descriptor
方法名称和描述符
我们使用反编译工具查看一下:
[+]view code
常量池中的项目类型如下:
CONSTANT_Utf8_info&&&&& tag标志位为1,&& UTF-8编码的字符串
CONSTANT_Integer_info& tag标志位为3, 整形字面量
CONSTANT_Float_info&&&& tag标志位为4, 浮点型字面量
CONSTANT_Long_info&&&& tag标志位为5, 长整形字面量
CONSTANT_Double_info& tag标志位为6, 双精度字面量
CONSTANT_Class_info&&& tag标志位为7, 类或接口的符号引用
CONSTANT_String_info&&& tag标志位为8,字符串类型的字面量
CONSTANT_Fieldref_info& tag标志位为9,& 字段的符号引用
CONSTANT_Methodref_info& tag标志位为10,类中方法的符号引用
CONSTANT_InterfaceMethodref_info tag标志位为11, 接口中方法的符号引用
CONSTANT_NameAndType_info tag 标志位为12,字段和方法的名称以及类型的符号引用
5. 类或接口访问标志
表示类或者接口方面的访问信息,比如Class表示的是类还是接口,是否为public、static、final等。,下面我们就来看看TestClass的访问标示。Class的访问标志值为0x0021:
根据前面说的各种访问标示的标志位,我们可以知道:0x1|0x0020 也即ACC_PUBLIC 和 ACC_SUPER为真,其中ACC_PUBLIC大家好理解,ACC_SUPER是jdk1.2之后编译的类都会带有的标志。
6. 类索引、父类索引与接口索引集合
Class文件中由这3项数据来确定类的继承关系。
类索引和父类索引都是指向常量池中的常量索引:
7. 字段表集合
作用:描述接口或者类中声明的类变量以及实例变量,不包括方法中的局部变量。
紧接着接口索引集合之后的2字节是字段计数器:
描述符标识字符含义:
V 表示特殊类型void。
对于数组类型,每一个维度将使用一个前置的&[&字符来描述,如一个定义的&java.lang.String[][]&类型的二维数组,将被记录为:&[[Ljava/lang/S&,一个整型数组&int[]&将被记录为&[I&
父类中的字段不会出现在子类的字段表中。
8. 方法表集合
字段表集合结束后便是方法表集合。
作用:描述该类中的方法。
和字段表一样,使用一个u2类型的方法计数器,记录该类中方法的个数。
&

我要回帖

更多关于 class 看jdk版本 的文章

 

随机推荐