zoukankan      html  css  js  c++  java
  • @Retention注解

    参考链接:https://blog.csdn.net/asdgbc/article/details/70196749

    https://www.cnblogs.com/gmq-sh/p/4798194.html

    @Retention注解

    日常开发中经常用到注解,所以也会经常使用到@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(){};
    
    }
    

    通过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的注解信息

  • 相关阅读:
    关于MATLAB处理大数据坐标文件2017527
    关于MATLAB处理大数据坐标文件2017526
    关于MATLAB处理大数据坐标文件
    Python入门(2)
    Python入门
    [leetcode] 349. Intersection of Two Arrays 解题报告
    [leetcode] 283. Move Zeroes 解题报告
    [leetcode] 389. Find the Difference 解题报告
    [leetcode] 104. Maximum Depth of Binary Tree
    [leetcode] 258. Add Digits
  • 原文地址:https://www.cnblogs.com/txfsheng/p/9371112.html
Copyright © 2011-2022 走看看