好模板网站,东莞人才市场档案服务中心,wordpress调用 php文件,承德网站制作与建设From: https://blog.csdn.net/asdgbc/article/details/70196749
日常开发中经常用到注解#xff0c;所以也会经常使用到Retention注解#xff0c;写下这篇文章做个记。 Reteniton的作用是定义被它所注解的注解保留多久#xff0c;一共有三种策略#xff0c;定义在Retentio…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: stack0, locals1, args_size1 0: return LineNumberTable: line 5: 0 public void classLevel(); descriptor: ()V flags: ACC_PUBLIC Code: stack0, locals1, args_size1 0: return LineNumberTable: line 7: 0 RuntimeInvisibleAnnotations: 0: #11() public void runtimeLevel(); descriptor: ()V flags: ACC_PUBLIC Code: stack0, locals1, args_size1 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的注解信息