日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

@Retention注解

發(fā)布時(shí)間:2023/12/9 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @Retention注解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

日常開(kāi)發(fā)中經(jīng)常用到注解,所以也會(huì)經(jīng)常使用到@Retention注解,寫(xiě)下這篇文章做個(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)行為,所有沒(méi)有用Retention注解的注解,都會(huì)采用這種策略。

??? RUNTIME
??? 保留至運(yùn)行時(shí)。所以我們可以通過(guò)反射去獲取注解信息。

下面,我們通過(guò)一個(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

通過(guò)javap獲取到Test類(lèi)的字節(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. 編譯器并沒(méi)有記錄下sourceLevel方法的注解信息
2. 編譯器分別使用了RuntimeInvisibleAnnotations和RuntimeVisibleAnnotations屬性去記錄了classLevel和runtimeLevel的注解信息

總結(jié)

以上是生活随笔為你收集整理的@Retention注解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。