目录
  1. 1. Field(字段)
    1. 1.1. access_flags
    2. 1.2. name_index
    3. 1.3. descriptor_index
    4. 1.4. attribute_count
    5. 1.5. attributes[attributes_count]
字段(Field)

Field(字段)

每个字段都是由一个field_info结构体来描述。在一个class文件中不可能有两个相同字段名和描述符的字段。

field_info结构体格式:

1
2
3
4
5
6
7
field_info {
u2 access_flags; // 访问修饰符标志(public , protected,private等)
u2 name_index; // 在常量池中字段名所在的索引
u2 descriptor_index; // 在常量池中字段描述符所在的索引
u2 attributes_count; // 属性计数
attribute_info attributes[attributes_count]; // 属性数组
}

access_flags

字段的访问修饰符标志有以下这些:
field_access_flags

  1. 一个类的字段可能有ACC_PUBLIC,ACC_PRIVATE,ACC_PROTECTED三种中的一种访问标志,并且必不可能有ACC_FINAL和ACC_VOLATILE访问标志。
  2. 一个接口的字段必须有ACC_PUBLIC,ACC_STATIC,ACC_FINAL三个访问标志被设置,并且ACC_SYNTHEIC可能会被设置,其他的访问标志必不可能被设置。
  3. ACC_SYNTHEIC访问标志显示了这个字段是由编译器生成的,并且不会在写在源码中。
  4. ACC_ENUM访问标志显示了这个字段是一个枚举类型的一个元素。
  5. 在以上表中未分配的访问标志项的所有位以待将来使用。它们在一个class文件中被设置为0,而且java虚拟机实现会忽视它们。

name_index

name_index的值必须是是常量池表中一个有效索引。这个常量池索引指向的常量池项必须是一个代表一个有效unqualified名的CONTSANT_Utf-8_info结构体,这个结构体表示的就是这个字段。

descriptor_index

descriptor_index的值必须是常量池表中的一个有效索引。这个索引指向的常量池项必须是一个CONTSANT_Utf-8_info结构体,这个结构体代表一个有效的字段描述符。

attribute_count

attribute_count的值表示这个字段的附加属性的数量。

attributes[attributes_count]

  1. 这个属性表的每个值必须是一个attribute_info结构体。以下就是attribute_info结构体:
1
2
3
4
5
attribute_info {
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length];
}
  1. 一个字段可能有与它有关联的一些可选属性。
  2. 这些属性的规范定义在以下field_info结构体的属性表中表示:
    attribute_spec
  3. 查看属性表的详情请点击这里
文章作者: rack-leen
文章链接: http://yoursite.com/2020/01/21/Java/jvm/class%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F/%E5%AD%97%E6%AE%B5-Field/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 rack-leen's blog
打赏
  • 微信
  • 支付宝

评论