之前在开发框架的时候大量使用了注解简化框架的使用和理解成本。所以整理一下Java注解在Class文件中的具体表示。
在Java的class文件中,注解被存储在一个叫做RuntimeVisibleAnnotations或者RuntimeInvisibleAnnotations的属性中。这两个属性分别对应运行时可见的注解和运行时不可见的注解。
每个注解在class文件中的表示形式如下:
u2类型的type_index,指向一个CONSTANT_Utf8_info结构,表示注解接口的名称。u2类型的num_element_value_pairs,表示注解的键值对数量。element_value_pairs列表,表示注解的键值对列表。每个键值对由一个element_value_pairs结构表示,包含一个u2类型的element_name_index和一个element_value结构。element_name_index指向一个CONSTANT_Utf8_info结构,表示键的名称。element_value结构表示值,可以是常量、枚举常量、类信息、注解类型或者数组。
例如,对于如下的注解:
@MyAnnotation(name="test", value=1)
在class文件中的表示形式可能如下:
RuntimeVisibleAnnotations:
num_annotations = 1
annotations[0]:
type_index = #22 (#22 -> CONSTANT_Utf8_info: "LMyAnnotation;")
num_element_value_pairs = 2
element_value_pairs[0]:
element_name_index = #23 (#23 -> CONSTANT_Utf8_info: "name")
value = CONSTANT_Utf8_info: "test"
element_value_pairs[1]:
element_name_index = #24 (#24 -> CONSTANT_Utf8_info: "value")
value = CONSTANT_Integer_info: 1
这只是一个简化的表示,实际的表示会更复杂。具体的表示方式可以参考Java虚拟机规范。