@Retention注解
From: https://blog.csdn.net/asdgbc/article/details/70196749
日常開發(fā)中經(jīng)常用到注解,所以也會(huì)經(jīng)常使用到@Retention注解,寫下這篇文章做個(gè)記。
Reteniton的作用是定義被它所注解的注解保留多久,一共有三種策略,定義在RetentionPolicy枚舉中
public enum RetentionPolicy {
??? SOURCE,
??? CLASS,
??? RUNTIME
}
??? 1
??? 2
??? 3
??? 4
??? 5
??? SOURCE
??? 被編譯器忽略
??? CLASS
??? 注解將會(huì)被保留在Class文件中,但在運(yùn)行時(shí)并不會(huì)被VM保留。這是默認(rèn)行為,所有沒有用Retention注解的注解,都會(huì)采用這種策略。
??? RUNTIME
??? 保留至運(yùn)行時(shí)。所以我們可以通過反射去獲取注解信息。
下面,我們通過一個(gè)例子去驗(yàn)證一下。我定義了不同策略的注解去注解了三個(gè)方法
@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類的字節(jié)碼
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的注解信息
總結(jié)
以上是生活随笔為你收集整理的@Retention注解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux nohup 命令详解
- 下一篇: 获取文件哈希值_系统装机|两款最经典的文