@Retention注解的使用
程序员文章站
2022-09-28 16:34:16
@Retention注解
日常开发中经常用到注解,所以也会经常使用到@Retention注解,写下这篇文章做个记。
Reteniton的作用是定义被它所注解的注解保留多久,一共有三种策略,...
@Retention注解
日常开发中经常用到注解,所以也会经常使用到@Retention注解,写下这篇文章做个记。
Reteniton的作用是定义被它所注解的注解保留多久,一共有三种策略,定义在RetentionPolicy枚举中
public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }
SOURCE
被编译器忽略
CLASS
注解将会被保留在Class文件中,但在运行时并不会被VM保留。这是默认行为,所有没有用Retention注解的注解,都会采用这种策略。
RUNTIME
保留至运行时。所以我们可以通过反射去获取注解信息。
下面,我们通过一个例子去验证一下。我定义了不同策略的注解去注解了三个方法
@Retention(RetentionPolicy.SOURCE) public @interface SourceLevel { } @Retention(RetentionPolicy.CLASS) public @interface ClassLevel { } @Retention(RetentionPolicy.RUNTIME) public @interface RuntimeLevel { } public class Test { @SourceLevel public void sourceLevel(){} @ClassLevel public void classLevel(){}; @RuntimeLevel public void runtimeLevel(){}; }
通过javap获取到Test类的字节码
public void sourceLevel(); descriptor: ()V flags: ACC_PUBLIC Code: stack=0, locals=1, args_size=1 0: return LineNumberTable: line 5: 0 public void classLevel(); descriptor: ()V flags: ACC_PUBLIC Code: stack=0, locals=1, args_size=1 0: return LineNumberTable: line 7: 0 RuntimeInvisibleAnnotations: 0: #11() public void runtimeLevel(); descriptor: ()V flags: ACC_PUBLIC Code: stack=0, locals=1, args_size=1 0: return LineNumberTable: line 9: 0 RuntimeVisibleAnnotations: 0: #14()
我们可以看到
1. 编译器并没有记录下sourceLevel方法的注解信息
2. 编译器分别使用了RuntimeInvisibleAnnotations和RuntimeVisibleAnnotations属性去记录了classLevel和runtimeLevel的注解信息
以上。
上一篇: 发布高质量外链的实用方法