Java class文件格式之属性详解.pdfVIP

  • 6
  • 0
  • 约7.28千字
  • 约 9页
  • 2018-04-30 发布于河北
  • 举报
Java class文件格式之属性详解.pdf

Java class 文件格式之属性详解 Code 属性 code 属性是方法的一个最重要的属性。 因为它里面存放的是方法的字节码指令, 除此之外还存放了和操作数栈,局 部变量相关的信息。 所有不是抽象的方法, 都必须在 method_info 中的 attributes 中有一个 Code 属性。下面是 Code 属性的结构, 为了更直观的展示 Code 属性和 method_info 的包含关系, 特意画出了 method_info : 下面依次介绍 code 属性中的各个部分。 attribute_name_index 指向常量池中的一个 CONSTANT_Utf8_info , 这个 CONSTANT_Utf8_info 中存放的是当前属 性的名字 “Code” 。 1 / 9 attribute_length 给出了当前 Code 属性的长度(不包括前六字节)。 max_stack 指定当前方法被执行引擎执行的时候, 在栈帧中需要分配的操作数栈的大小。 max_locals 指定当前方法被执行引擎执行的时候, 在栈帧中需要分配的局部表量表的大小。注意, 这个数字并不是局部 变量的个数, 因为根据局部变量的作用域不同 ,在执行到一个局部变量以外时, 下一个局部变量可以重用上一个局部变量 的空间(每个局部变量在局部变量表中占用一个或两个 Slot )。方法中的局部变量包括方法的参数, 方法的默认参数 this , 方法体中定义的变量, catch 语句中的异常对象。 关于执行引擎的相关内容会在后面的博客中讲到。 code_length 指定该方法的字节码的长度, class 文件中每条字节码占一个字节。 code 存放字节码指令本身, 它的长度是 code_length 个字节。 exception_table_length 指定异常表的大小 exception_table 就是所谓的异常表, 它是对方法体中 try-catch_finally 的描述。 exception_table 可以看做是一个数组, 每个数组项是一个 exception_info 结构, 一般来说每个 catch 块对应一个 exception_info ,编译器也可能会为当前方法生 成一些 exception_info。 exception_info 的结构如下(为了直观的显示 exception_info ,exception_table 和 Code 属性 的关系, 画出了 Code 属性,的话读者就会更清楚各个数据项之间的位置关系和包含关系): 2 / 9 下面讲解 exception_info 中的各个字段的意思。 start_pc 是从字节码(Code 属性中的 code 部分)起始处到当前异常处理器起始处的偏移量。 end_pc 是从字节码起始处到当前异常处理器末尾的偏移量。 handler_pc 是指当前异常处理器用来处理异常(即 catch 块)的第一条指令相对于字节码开始处的偏移量。 catch_type 是一个常量池索引, 指向常量池中的一个 CONSTANT_Class_info 数据项, 该数据项描述了 catch 块中的异常 的类型信息。这个类型必须是 java.lang.Throwable 的或其子类。 所以可以总结, 一个异常处理器(exception_info )的意思是: 如果偏移量从 start_pc 到 end_pc 之间的字节码出现了 catch_type 描述的类型的异常, 那么就跳转到偏移量为 handler_pc 的字节码处去执行。如果 catch_type 为 0 ,就代表不 引用任何常量池项(再回顾一下, 常量池中的项是从 1 开始计的), 那么这个 exception_info 用于实现 finally 子句。 我们一直在介绍 Code 属性,只不过刚才进行了一个小插曲,介绍了 Code 属性中的 exception_table 中的 exception_info 的详细信息。 下面我们继续介绍 Code 属性中的其他信息, 希望读者不要被绕晕了 : ) attributes_count 表示当前 Code 属性中存在的其他属性的个数。 现在我们知道, class 中的属性, 不仅会出现在顶层 的 class

文档评论(0)

1亿VIP精品文档

相关文档