跳到内容
argsno
返回

Java注解在Class文件中的表示

之前在开发框架的时候大量使用了注解简化框架的使用和理解成本。所以整理一下Java注解在Class文件中的具体表示。

在Java的class文件中,注解被存储在一个叫做RuntimeVisibleAnnotations或者RuntimeInvisibleAnnotations的属性中。这两个属性分别对应运行时可见的注解和运行时不可见的注解。

每个注解在class文件中的表示形式如下:

  1. u2类型的type_index,指向一个CONSTANT_Utf8_info结构,表示注解接口的名称。
  2. u2类型的num_element_value_pairs,表示注解的键值对数量。
  3. 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虚拟机规范。


分享这篇文章:

上一篇文章
2023 Review
下一篇文章
Guava Cache 之 Expire vs Refresh