最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码。
为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构。
于是,我就认真看了下OpenJDK中Java字节码文件的相关源码,结合大学期间对JVM的研究,参考JVM规范第2版(英文原版),特意整理下。
JVM规范中定义的类文件的结构
注:使用是类似于C语言的表示方法
u1: unsigned one-byte 无符号一个字节
u2: unsigned two-byte 无符号两个字节
u4: unsigned four-byte 无符号四个字节
ClassFiel{
//魔法数字
u4 magic;
//次版本号
u2 minor_version;
//主版本号
u2 major_version;
//常量池中常量的个数
u2 constant_pool_count;
//常量池数组
cp_info_constant_pool[constant_pool_count-1];
//类或接口的访问标识符
u2 access_flag;
//这个类在常量池中的下标
u2 this_class;
//这个类的父类在常量池中的下标
u2 super_class;
//父接口的数量
u2 interfaces_count;
//父接口的数组
u2 interfaces[interfaces_count];
//字段的个数
u2 fields_count;
//字段的信息
field_info fields[fields_count];
//方法的个数
u2 methods_count;
//方法的信息
method_info methods[methods_count];
//属性的个数(不是字段)
u2 attributes_count;
//属性的信息,attribute_info是一种用来表示信息的结构
attribute_info attributes[attributes_count];
}
OpenJDK中定义的类文件的结构
public class ClassFile {
public final int magic;
public final int minor_version;
public final int major_version;
public final ConstantPool constant_pool;
public final AccessFlags access_flags;
public final int this_class;
public final int super_class;
public final int[] interfaces;
public final Field[] fields;
public final Method[] methods;
public final Attributes attributes;
}
定义异同点
OpenJDK中的定义和JVM规范中的定义,是等同的。
区别就是表示方法不一样,前者是Java语言表示方式,后者是类似于C语言的表示方式。
不足之处
详细描述,每一个数据结构,估计需要花费太多的篇幅。
本文浅尝辄止,大家对Java字节码文件的结构有个大概的了解就好。
下一篇,我们将介绍如何读取.class文件。
未来计划
JDK,JVM,Javac,字节码等内容实在是太多了,好多我也还在研究之中。
最近,写作任务很艰巨,只能一篇篇的写。
还望大家理解。
互动交流
OpenJDK源码研究笔记系列文章,都是我的原创。
有啥不懂的问题,可以留言。
有啥觉得不对的地方,欢迎指正。
参考资料:OpenJDK源码,JVM规范第2版(英文原版)
相关阅读:http://blog.csdn.net/fansunion/article/category/1686259