升职高薪之路——JVM中Class文件结构之访问标志

243 阅读2分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

 Access(类的访问标志位)

  image.png

简介

access_flags是一种由标志所构成的掩码,用于表示某个类或者接口的访问权限属性

 分类

image.png

 This(本类索引)

image.png

 简介

this_class的值必须是对常量池表中某项的一个有效索引值常量池在这个索引处的成员必须为CONSTANT_Class_info类型结构体,该结构体表示这个class文件所定义的类或接口。

Super(父类索引)

image.png

 简介

  • 对于类来说,super_class的值要么是0,要么是对常量池表中某项的一个有效索引值 如果它的值不为0 ,那么常量池在这个索引处的成员必须为 CONSTANT_Class_info类型常量,它表示这个class文件所定义的类的直接超类。

  • 如果class文件的super_class的值为0,那这个class文件只可能用来表示Object类,因为它是唯一没有父类的类

  • 对于接口来说,它的class文件的super_class项必须是对常量池表中某项的一个有效索引值。常量池在这个索引处的成员必须为代表Object类的CONSTANT_Class_info结构。

 Interface

 简介

  • 表示类或者接口的直接父接口

  • 父接口的表示由接口总数和接口数组组成

  • 每个父接口元素为CONSTANT_Class_info****

  • 数据结构

image.png  

 Field

 简介

  • 表示类中定义的字段(包括静态和非静态的字段)

  • 数据结构

image.png

Field_info

  • 数据结构

image.png

access_flags

  • 表示字段的访问标记

  • 有9种标记

image.png

name_index

  • 表示字段名

descriptor_index

  • 表示字段描述符的索引

attributes_count

  • 表示字段属性总数

attributes_info

  • 表示字段属性元素数组

适合字段属性分类有6种

1、ConstantValue

  • 表示静态变量的初始值(static final修饰的),且必须是值类型和String类型(String类型不能是new的)

image.png

2、Synthetic

  • 类成员没有在源文件中出现,由编译器自动产生的

image.png

3、Signature

  • 泛型签名

image.png

4、Deprecated

  • 过时的字段

image.png

5、RuntimeVisibleAnnotations

  • 使用的注解,并且是运行时可见注解(JVM可以反射读取)
  • 注解定义是RetentionPolicy.RUNTIME的注解

image.png

6、RuntimelnvisibleAnnotations

  • 使用的注解,并且是运行时非可见注解(JVM不能反射读取)

  • 注解定义是RetentionPolicy.CLASS的注解

image.png

注解生命周期定义

  • RetentionPolicy.SOURCE——此注解类型的信息只会记录在源文件中,编译时将被编译器丢弃,不会存在class字节码文件中

  • RetentionPolicy.CLASS(默认值)——编译器将注解记录在class字节码文件中,但不会加载到JVM中。无法反射读取。

  • RetentionPolicy.RUNTIME——编译器将注解记录在class字节码文件中,在执行的时也加载JVM中,可以反射读取。