Access
access_flags是一种由标志所构成的掩码,用于表示某个类或接口的访问权限属性。
This(本类索引)
this_class的值必须是对常量池表中某项的一个有效索引值常量池在这个索引处的成员必须为CONSTANT_Class_info类型结构体,该结构表示这个class文件所定义的类或接口。
Super(父类索引)
对于类来说,super_class的值要么是0,要么是对常量池中某项的一个有效索引值,如果他的值不是0,那么常量池在这个索引处的成员必须为CONSTANT_class_info类型的常量。
如果class文件的super_class的值为0,那这个class文件之可能用来表示Object类,因为它没有父类。
对于接口的class文件的super_class项必须是对常量池表中某项的一个有效索引值,常量池在这个索引处的成员必须为代表Obeject类的CONSTANT_class_info结构。
Interface(本类索引)
表示类或接口的直接父接口
父接口的表示由接口总数和接口数组组成
每个父接口的元素为CONSTANT_class_info.
Field
表示类中定义的字段(包含静态和非静态字段)
field_info
access_flags 字段访问标记(9种标记)
name_index 字段名
descriptor_index 字段描述符的索引
attribute_count 字段属性总数
attribute_info 字段属性元素数组
字段分类属性有六种
-
ConstantValue
表示静态变量的初始值(static final修饰),且必须是值类型 和String类型(String类型不能是new的) -
Synthetic
类成员没有在源文件中出现,由编译器自动产生的 -
Signature
泛型签名 -
Deprecated
过时的字段 -
注解属性
RuntimeVisibleAnnotations
使用的注解,并且运行时是可见的注解(JVM可以反射读取)
注解定义是RetentionPolicy.RUNTIME注解
RuntimeInvisibleAnnotations
使用的注解,并且运行时是不可见的注解(JVM不可以反射读取)
注解定义是RetentionPolicy.CLASS注解
面试题:注解生命周期
- RetentionPolicy.SOURCE
此注解类型的信息只会记录在源文件中,编译时将被编译器丢弃,不会存在字节码class文件中 - RetentionPolicy.CLASS(默认值)
编译器将注解记录在class字节码文件中,但不会加载到JVM中,无法反射读取 - RetentionPolicy.RUNTIME
编译器将注解记录在class字节码文件中,在执行时加载到JVM中,可以反射读取