类索引和父类索引都是一个u2的类型,而接口索引是一个u2类的数据集合,Class中由这三项数据来确定类的继承关系。类索引、父类索引和接口索引集合都是有序的排列在访问标识之后,类索引和父类索引两个u2类型的索引值表示,他们各自指向一个类型为COMNSTANT_Class_info的类描述符常量,通过该常量的索引值找到定义在COMNSTANT_Utf8_info类型的常量中的全限定名字符串,而接口索引集合用来描述这个类实现了哪些接口,这些被实现的接口按implements语句后的接口顺序从左往右排列在接口集合中。
七、字段表集合(fileds)字段表(field_info)用于描述类或者接口中声明的变量。字段包括了类级别变量和实例变量,但是不包括声明在方法中的变量。字段的名称,类型和修饰符等都是无法固定的,只能引用常量池中的常量来描述,可以包括的信息有:
字段的作用域,如public,private等修饰符。
示例变量还是类变量,如static修饰符。
可变性,final修饰符
并发可见性,volatile修饰符。
可否被序列化,transient修饰符。
字段数据类型,基本数据类型,数组,引用类型等。
字段名称
字段表结构如下:
类型 名称 数量u2 access_flags 1
u2 name_index 1
u2 descriptor_index 1
u2 attribute_count 1
attribute_info attributes attribute_count
其中的access_flags与类中的access_flags非常类似,表示数据类型的修饰符,比如public,private,protected等,后面的name_index和descriptor_index都是对常量池的引用,分别表示字段的简单名称以及字段和方法的描述符。描述符的作用是用来描述字段的类型,方法的参数列表和返回值,根据描述符的规则,详细的描述符含义如下:
对于数组类型,每一个维度都将使用一个前置的“[”字符来描述,如一个整数数组int[] 将被记录为 "[I",二维整数数组int[][] 记录为 "[[I"。而对于对于一个对象类型比如 String[] 数组,将被记录为 "[Ljava/lang/String"。用方法描述符描述方法时,先按照方法参数的顺序,然后再返回值的顺序来描述,比如 int get(String name,int[] index,int i,char c)方法的描述符为 "(Ljava/lang/String[IIC)I"。字段表都包含的固定的数据项在descriptor_index为止,不过在descriptor_index后是一个属性表集合,用于存储一些额外的信息。
八、方法表集合(methods)放发表(method_info)的结构与属性表的就够相同,方法里的Java代码经过编译器编译后编程字节码指令,然后存放在方法属性表的一个名为“Code”的属性里,关于属性表的项目,同样会在后面跟进行详细的介绍。