每个class文件都对应着唯一一个类或接口的定义信息,该文件都是由字节流组成。其中u1、u2和u4分别代表了1、2和4字节的无符号数,用它们来表示class文件的内容。
ClassFile 结构如下:
<span style="font-size:14px;">ClassFile{
u4 magic;//魔数:0xCAFEBABE
u2 minor_version;//次版本号
u2 major_version;//主版本号:JDK版本(k>=2),对应的范围为45.0~44+k.0
u2 constant_pool_count;//值为常量池成员数+1
cp_info constant_pool[constant_pool_count];//下标为0:表示“不引用任何一个常量池”
u2 access_flags;//访问标志
u2 this_class;//类索引(常量池表中的一个有效索引),该索引处的成员为CONSTANT_Class_info类型常量(类/接口)
u2 super_flags;//父类索引,类:(0或者常量池有效索引),0表示该类为Object;
//接口:对应Object类的CONSTANT_Class_info的索引
u2 interfaces_count;//接口计数器,可以为0
u2 interfaces[interfaces_count];//接口表:常量池中CONSTANT_Class_info的有效索引
u2 fields_count;//字段计数器
field_info fields[fields_count];//字段表:成员为field_info结构,不包括父类或父接口的字段
u2 methods_count;//方法计数器
method_info methods[methods_count];//方法表:成员为method_info结构,包括<clinit>和<init>,不包括父类或父接口的方法
u2 attributes_count;//属性计数器
attribute_info attributes[attributes_count];//属性表:成员为attribute_info结构,Signature、InnerClasses等
}</span>