上QQ阅读APP看书,第一时间看更新
2.5 属性介绍
2.5.1 属性概貌
属性是Class文件的重要组成部分。和常量池类似,属性也分很多类型。在Java虚拟机规范中,属性可用attribute_info数据结构伪代码表示。
[attribute_info]
attribute_info { u2 attribute_name_index; // 属性名称,指向常量池中Utf8常量项的索引 u4 attribute_length; // 该属性具体内容的长度,即下面info数组的长度 u1 info[attribute_length]; // 属性具体内容 }
和常量池类型不一样的是,属性是由其名称来区别的,即attribute_info中的attribute_name_index所指向的Utf8字符串。表2-5列出了一些重要属性的名称和它们的作用。
表2-5 属性名称和作用
以上介绍了几种常见的属性,可知:
·属性的类型由其名字来描述。比如"Code""SourceFile"等。
·不同类型的属性可能出现在ClassFile中不同的成员里,比如"Code"属性只能出现在method_info中。读者不要小瞧了这个规则,因为虚拟机在解析Class文件的时候是需要校验很多内容的,比如abstract的函数或native的函数就不能携带"Code"属性。以后我们会单独介绍Class文件校验相关的知识。
·属性也可以包含子属性,比如"Code"属性能包含"LocalVariableTable"属性。