不知道Java类文件结构的同学,看这篇文章就够了 (2)

  类索引和父类索引都是一个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都是对常量池的引用,分别表示字段的简单名称以及字段和方法的描述符。描述符的作用是用来描述字段的类型,方法的参数列表和返回值,根据描述符的规则,详细的描述符含义如下:

不知道Java类文件结构的同学,看这篇文章就够了

  对于数组类型,每一个维度都将使用一个前置的“[”字符来描述,如一个整数数组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”的属性里,关于属性表的项目,同样会在后面跟进行详细的介绍。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjdwj.html