根据Java虚拟机规范,类文件由单个ClassFile结构组成:
ClassFile {
u4 magic; //Class ⽂件的标志
u2 minor_version;//Class 的⼩版本号
u2 major_version;//Class 的⼤版本号
u2 constant_pool_count;//常量池的数量
cp_info constant_pool[constant_pool_count-1];//常量池
u2 access_flags;//Class 的访问标记
u2 this_class;//当前类
u2 super_class;//⽗类
u2 interfaces_count;//接⼝
u2 interfaces[interfaces_count];//⼀个类可以实现多个接⼝
u2 fields_count;//Class ⽂件的字段属性
field_info fields[fields_count];//⼀个类会可以有个字段
u2 methods_count;//Class ⽂件的⽅法数量
method_info methods[methods_count];//⼀个类可以有个多个⽅法
u2 attributes_count;//此类的属性表中的属性数
attribute_info attributes[attributes_count];//属性表集合
}
1、魔数:确定这个文件是否是一个能被虚拟机接收的Class文件。
2、Class文件版本:Class文件的版本号,保证编译正常执行。
3、常量池:常量池主要存放两个常量:字符量和符号引用。
4、访问标志:标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口,是否为public或abstract类型,如果是类的话是否声明为final等等。
5、当前类索引,父类索引:类索引用于确定这个类的权限定名,父类索引用于确定这个类的父类的全限定名,由于Java语言的单继承,所以父类索引只有一个,除了java.lang.Object之外,所有的Java类都有父类,因此除了java.lang.Object外,所有Java类的父类索引都不为0。
6、接口索引集合:接口索引集合用来描述这个类实现了那些接口,这些被实现的接口将按implements(如果这个类本身是接口的话则是extends)后的接口顺序从左到右排列在接口索引集合中。
7、字段表集合:描述接口或类中声明的变量。字段包括类级变量以及实例变量,但不包括在方法内部声明的局部变量。
8、方法表集合:类中的方法。
9、属性表集合:在Class文件,字段表,方法表中都可以携带自己的属性表集合。