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

方法计算值为0x0003,表示集合中有两个方法(编译器自动添加的无参构造方法和源码中的plusOne方法)。第一个方法的访问标志是0x0001,表示只有ACC_PUBLIC标志为true。

名称索引为0x0007,在常量池中为索引为7的字符串为“”,这就是编译器自动添加的无参构造方法。描述符索引为0x0008,在常量池中为索引为7的字符串为“()V”,方法的属性计数值为0x0001,表示该方法有1个属性,属性名称索引为0x0009,在常量池中为索引为7的字符串为“Code”。以下是常量池相关内容:

#7 = Utf8 <init> #8 = Utf8 ()V #9 = Utf8 Code

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

属性表集合

属性表(attribute_info)在前面的分享中出现了几次,在Class文件、字段表、方法表都可以有自己的属性表集合,用来描述某些场景下特有的信息。

属性表不在要求具有严格的顺序,并且只要不与已有的属性名重复,任何人实现的编译器都可以写入自己定义的属性信息,Java虚拟机在运行时会忽略掉它不认识的属性。

我总结了一些比较常见的属性,如下表:

属性名称 使用位置 含义
Code   方法表   Java代码编译成的字节码指令  
ConstantValue   字段表   final关键字定义的常量值  
Exceptions   方法表   方法抛出的异常  
InnerClasses   类文件   内部类列表  
LineNumberTable   Code属性   Java源码的行号与字节码指定的对应关系  
LocalVariableTable   Code属性   方法的局部变量描述  
SourceFile   类文件   记录源文件名称  

对于每个属性,它的名称都从常量池中引用一个CONSTANT_Utf8_info类型的常量,而属性值的结构则是完全自定义的,只需要用一个u4类型来说明属性值所占的位数就可以了。具体结构如下:

类型 名称 数量 含义
u2   attribute_name_index   1   属性名称索引  
u2   attribute_length   1   属性值所占的位数  
u1   info   attribute_length   属性值  

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

总结

Class文件主要由魔数、次版本号、主版本号、常量池集合、访问标志、类索引、父类索引、接口索引集合、字段表集合、方法表集合和属性表集合组成。随着JDK版本的不断升级,Class文件结构也在不断更新,学习之路,永不止步。

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

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

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