代码属性(Code Attribute)
代码属性是一个可变长度属性,在method_info结构体中的属性表(attributes字段)用到。代码属性保存了单个方法、实例初始化方法或者类(或接口)初始化方法。JVM实现必须识别代码属性。如果是本地方法或抽象方法,method_info结构中不可以有代码属性。否则method_info结构中必须有代码属性。
代码属性结构:
Code_attribute { u2 attribute_name_index; u4 attribute_length; u2 max_stack; u2 max_locals; u4 code_length; u1 code[code_length]; u2 exception_table_length; { u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type; } exception_table[exception_table_length]; u2 attributes_count; attribute_info attributes[attributes_count]; |
attribute_name_index:
属性名称索引,表示这个属性在常量表中的索引,必须是一个有效的索引。常量表中这个索引位置的常量表记录必须是CONSTANT_Utf8_info结构,且为字符串“Code”
attribute_length:
属性长度,不包括初始6个字节。
max_stack:
最大深度,表示某个正在执行的方法,包括方法实例初始化方法或者类(或接口)初始化方法的操作数栈的最大深度。
max_locals:
表示在方法,包括方法实例初始化方法或者类(或接口)初始化方法在被调用时,局部变量表中最大局部变量的数目。
code_length:
表示方法,包括方法实例初始化方法或者类(或接口)初始化方法的Java虚拟机码的字节数,也就是code字段的长度。
code:
Java虚拟机码的实际字节数组,表示方法,包括方法实例初始化方法或者类(或接口)初始化方法的Java虚拟机码的实际字节信息。
exception_table_length:
异常表(exception_table)中记录数。
exception_table:
异常表,异常表(exception_table)中每个记录表示code字段(Java虚拟机码的实际字节信息)中的一个异常处理(exception handler)。异常表(exception_table)中的异常处理顺序具有特殊意义。
attributes_count:
表示属性个数,也就是attributes 字段的长度。
attributes:
属性表,属性表中的每个属性必须是attribute_info结构。代码属性可以有任意多可选的属性。
目前,定义了两种属性:行号表(LineNumberTable), 局部变量表(LocalVariableTable),这两种属性都包含调试信息。并且与代码属性一起使用。
允许JVM虚拟机实现默认忽略任何或所有的属性。规范中未定义的属性不可以影响class文件的语义,只是提供额外的描述性信息。
异常表中的记录
异常表中的记录包括4项:
start_pc:
end_pc:
同start_pc
handler_pc:
catch_type