Class文件结构全面解析(下) (2)

描述符是用来描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值。基础数据类型和无返回的void类型都有一个大写字母表示,对象类型用字符L加对象的全限定名来表示,如下表:

标识字符 含义
B   基本类型byte  
C   基本类型char  
D   基本类型double  
F   基本类型float  
I   基本类型int  
J   基本类型long  
S   基本类型short  
Z   基本类型boolean  
V   特殊类型void  
L   对象类型 如 Ljava/lang/Object  

对于数组类型,每一维度使用一个前置的“[”字符来描述,比如java.lang.Object[][]的二维数据,就是“[[Ljava/lang/Object”。在描述方法时,按照先参数列表,后返回值的顺序描述,参数列表按照严格顺序放在“()”值中,比如boolean equals(Object anObject),就是“(Ljava/lang/Object)B”。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

再来看一下之前的Class文件例子:

Class文件结构全面解析(下)

OneMoreStudy类中只有一个字段number,所以字段计数值为0x0001。字段number只被private修饰,没有其他修饰,所以字段的访问标志位为0x0002。字段的简单名称索引是0x0005,去常量池中找索引为5的字符串,为“number”。字段的描述符索引为0x0006,去常量池中找索引为6的字符串,为“I”,是基本类型int。以下是常量池相关内容:

#5 = Utf8 number #6 = Utf8 I

字段number的属性计数值为0x0000,也就是没有需要额外描述的信息。

字段表集合中不会列出从父类或者父接口中继承而来的字段,但有可能列出原版Java代码中没有的字段,比如在内部类中为了保持对外部类的访问性,会自动添加指向外部类实例的字段。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

方法表集合

方法表的结构和字段表的是一样的,也是依次包括了访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)和属性表集合(attributes)。具体如下表:

类型 名称 数量 描述
u2   access_flags   1   方法的访问标志  
u2   name_index   1   方法的简单名称索引  
u2   descriptor_index   1   方法的描述符索引  
u2   attributes_count   1   方法的属性计数值  
attribute_info   attributes   attributes_count   方法的属性  

对于方法的访问标志,所有标志位和取值如下表:

标志名称 标志值 含义
ACC_PUBLIC   0x0001   方法是否public  
ACC_PRIVATE   0x0002   方法是否private  
ACC_PROTECTED   0x0004   方法是否protected  
ACC_STATIC   0x0008   方法是否static  
ACC_FINAL   0x0010   方法是否为final  
ACC_SYNCHRONIZED   0x0020   方法是否sychronized  
ACC_BRIDGE   0x0040   方法是否是由编译器产生的桥接方法  
ACC_VARARGS   0x0080   方法是否接受不定参数  
ACC_NATIVE   0x0100   方法是否为native  
ACC_ABSTRACT   0x0400   方法是否为abstract  
ACC_STRICT   0x0800   方法是否为strictfp  
ACC_SYNTHETIC   0x1000   方法是否由编译器自动产生  

方法中的Java代码,经过编译器编程成字节码指令后,放在方法属性表集合中一个名为“Code”的属性里,后面会有更多分享。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

再来看一下之前的Class文件例子:

Class文件结构全面解析(下)

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

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