JVM Code Attribute

代码属性(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

猜你喜欢

转载自lobin.iteye.com/blog/2326544