- 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)