欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

@Retention注解

发布时间:2023/12/9 75 豆豆
生活随笔 收集整理的这篇文章主要介绍了 @Retention注解 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

From: https://blog.csdn.net/asdgbc/article/details/70196749

日常开发中经常用到注解,所以也会经常使用到@Retention注解,写下这篇文章做个记。
Reteniton的作用是定义被它所注解的注解保留多久,一共有三种策略,定义在RetentionPolicy枚举中

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}

    1
    2
    3
    4
    5

    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(){};

}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

通过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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

我们可以看到
1. 编译器并没有记录下sourceLevel方法的注解信息
2. 编译器分别使用了RuntimeInvisibleAnnotations和RuntimeVisibleAnnotations属性去记录了classLevel和runtimeLevel的注解信息

总结

以上是生活随笔为你收集整理的@Retention注解的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。