Class文件分析(三)

Class文件对方法表中的方法的描述采用的方式基本一致(依次包括了:访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)、属性表集合(attributes))


因为volatile和transient关键字不能修饰方法所以方法表的访问标志中没有ACC_VOLATILE标志和ACC_TRANSIENT标志。相对的synchronized、native、strictfp、abstract关键字可以修饰方法,所以方法表的访问标志中增加了ACC_SYNCHRONIZED、ACC_NATIVE等等。

方法里的java代码通过编译器编译成字节码指令后存放在方法属性表集合中一个名为“Code”的属性里(属性表是Class文件格式中最具扩展性的一种数据项目)

方法表的集合入口地址是0x00000101第一个u2类型的数据是计数器容量表示这个集合有两个方法(一个是编译器添加的实例构造器<init>和源码中的方法Inc()第一个方法的访问标志值为0x001也就是只有ACC_PUBLIC标志为真,名称索引为0x007(查看Class文件分析(二)里面的代码清单)得到方法名为<init>,描述符索引值为0x0008对应常量为()V,属性计数器attributes_count的值为0x0001表示此方法的属性集合有一项属性,属性名称索引为0x0009对应常量为Code说明此属性是方法的字节码描述。

与字段表集合相对应的如果父类方法在子类中没有被重写,方法表集合中就 不会出现来自父类方法的信息。但是有可能会出现由编译器自动添加的方法,如类构造器‘<clinit>’方法和实例构造器方法<init>

在java中重载一个方法除了名称相同之外,必须要有一个跟原方法不同的特征签名(返回值不在特征签名中)。但是在class文件中,只要描述符不是完全一致的两个方法可以共存。也就是说如果两个方法有相同的名称和特征签名但是返回值不同,那么也可以合法共存于同一个class文件中。


在Class文件、字段表、方法表可以携带自己的属性表集合来描述某些场景专有的信息。属性表没有严格的顺序限制(只要不与已有的属性名重复,任何人实现的编译器都能向属性表写入自己定义的属性信息,java虚拟机运行时会忽略掉它所不认识的属性)(在java虚拟机中java SE7预定义属性已经增加到了21项)

Class文件分析(三)

Class文件分析(三)

Class文件分析(三)


对于每个属性它的名称需要从常量池引用一个CONSTANT_Utf8_info类型的常量表示,属性值得结构则是完全自定义的,只需要通过一个u4长度的属性去说明属性值所占用的位数。

Class文件分析(三)