在文章 JVM Class 文件结构详解二中,介绍了Java Class 文件的access_flags、this class、super class、interfaces、fields等信息,本篇文章继续介绍Class文件的其他内容。
1、methods_count 和methods
在上篇文章介绍了Class关于字段表的内容,而关于方法表的内容与其类似。首先看下方法表的结构,如下图:
其中方法的访问标志access_flags,u2数据类型,方法的访问标志如下:
对于示例代码,下图中红色的区域为本部分,如下:
其中:0x0002表示methods_count,u2类型,为2,表示有两个方法:代码中的returnValue方法和方法init(自动添加的)。
0x0001表示第一个方法的访问标志,u2类型,为1,表示为ACC_PUBLIC,即方法的修饰符为public的。
0x0007表示第一个方法的name_index,u2类型,为7,从下图中可查为方法名为“<init>”。
0x0008表示描述符索引值,u2类型,为8,从下图中查询对应的常量为()V。
0x0001表示属性计数器,u2类型,为1,表示此方法的属性表集合有一项属性,属性名称的索引值为下面的值。
0x0009表示属性名称的索引值,为9,查询下图常量表为Code,说明此属性是方法的字节码描述。
注意:方法内的代码编译成字节码指令后,存放在方法属性表集合中一个名称为“Code”的属性里面。
下图为“Code”属性:
2、attributes_count和attributes
属性表attribute_info在字段表、方法表等都出现过,用于描述某些场景专有的信息。
包含的属性如Code、ConstantValue、Exceptions等都具有各自的结构,应用在不同的场合,这里不一一展开。