@Retention注解簡單說明

@Retention注解簡單說明

是什么:

@Retention是用來修飾注解的邦邦,它定義了該注解被保留時間的長短安吁,是注解的注解,是JAVA元注解之一圃酵。

為什么:

注解有不同的生命周期柳畔,按不同的生命周期可分為3類。

1.某些注解只保存在源文件中郭赐,當.java文件翻譯成.class文件薪韩,該注解就被遺棄。

2.某些注解只保留到.class文件捌锭,但JVM加載.class文件時俘陷,該注解會被遺棄。

3.某些注解在.class被裝載時將被讀取观谦,在程序運行期間拉盾,將一直保留

這三種生命周期分別對應于三種狀態(tài)豁状。

1..java文件

2..class文件

3.內存中的字節(jié)碼

而@Retention的作用就是用于描述注解的生命周期捉偏。

怎么用:

首先看一下@Retention的源碼:

@Retention.png

它只有一個屬性值,RetentionPolicy的對象value泻红。

RetentionPolicy.png

這是一個enum類型夭禽,里面只有3個值SOURCE,CLASS,RUNTIME。@Retention就是靠這3個值來描述注解的生命周期谊路。

它們相對應的生命周期以及舉例:

RetentionPolicy 對應的生命周期 用法 舉例
SOURCE 只保存在源文件中讹躯,當.java文件翻譯成.class文件,該注解就被遺棄缠劝。 一般用于運行前的檢查 @Override,@SupressWarnings
CLASS 只保留到.class文件潮梯,但JVM加載.class文件時,該注解會被遺棄惨恭。 在編譯時進行一些預處理操作 @ButterKnife(Android)
RUNTIME 在.class被裝載時將被讀取秉馏,在程序運行期間,將一直保留脱羡。 在運行時去動態(tài)獲取注解信息 @Deprecated
  • 周期長度是SOURCE < CLASS < RUNTIME,所以前者能作用到的地方后者一定能作用到

  • @Override是讓編譯器檢查當前方法是否在覆蓋父類方法沃饶,@SupressWarnings也只是為了抑制代碼警告,在代碼編譯后就都沒有什么作用轻黑,因此不需要寫入.class文件糊肤。

  • @ButterKnife會在編譯時生成輔助代碼,所以用RetentionPolicy.CLASS修飾氓鄙。

  • RetentionPolicy.CLASS是默認生命周期馆揉,沒有被@Retention修飾的注解的生命周期都是這種策略。

  • RetentionPolicy.RUNTIME修飾的注解處理器可以通過反射獲取該注解的屬性值抖拦,從而做一些運行時的邏輯處理升酣。

關于@Deprecated的額外話

從上表可知舷暮,@Deprecated是用RetentionPolicy.RUNTIME標記的,處理器是可以通過反射獲取@Deprecated的屬性的噩茄。

@Deprecated.png

但是去看源碼下面,@Deprecated什么屬性都沒有,處理器反射獲得屬性的行為也就沒什么必要绩聘。

于是有了一個想法沥割,為什么一定要RUNTIME,為什么不用SOURCE或者CLASS呢凿菩?

@Deprecated是警告標記的一些方法或類過時或者危險机杜,有更好的可以替代,但標記的方法或者類依舊可以用衅谷。

這樣像@Override和@SupressWarnings一樣編譯器檢查不就行了椒拗,為什么還需要設置為RUNTIME。

為此获黔,查詢了stackoverflow,這是投票最高的回答:

There are some frameworks and tools that instantiate objects to work with them.

For example, many JavaBean UI editors create instances of the beans and interact with them as the user manipulates the UI they're designing.

Having the @Deprecated annotation available at runtime allows tools such as this to flag deprecated methods, events, properties for the user.

“一些框架或者工具可以實例化對象來使用它們蚀苛。

例如,許多JavaBean UI編輯器創(chuàng)建bean的實例玷氏,并在用戶操縱他們正在設計的UI時與它們進行交互堵未。

通過在運行時使用@Deprecated注解,可以使用諸如此類的工具為用戶標記不贊成使用的方法预茄,事件和屬性兴溜≌旌瘢”

恕我愚笨耻陕,想不出例子來驗證這句話,如果能解釋這句話或者有更好的想法請賜教刨沦。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末诗宣,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子想诅,更是在濱河造成了極大的恐慌召庞,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件来破,死亡現場離奇詭異篮灼,居然都是意外死亡,警方通過查閱死者的電腦和手機徘禁,發(fā)現死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門诅诱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人送朱,你說我怎么就攤上這事娘荡「膳裕” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵炮沐,是天一觀的道長争群。 經常有香客問我,道長大年,這世上最難降的妖魔是什么换薄? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鲜戒,結果婚禮上专控,老公的妹妹穿的比我還像新娘。我一直安慰自己遏餐,他們只是感情好伦腐,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著失都,像睡著了一般柏蘑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粹庞,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天咳焚,我揣著相機與錄音,去河邊找鬼庞溜。 笑死革半,一個胖子當著我的面吹牛,可吹牛的內容都是我干的流码。 我是一名探鬼主播又官,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漫试!你這毒婦竟也來了六敬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驾荣,失蹤者是張志新(化名)和其女友劉穎外构,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體播掷,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡审编,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了歧匈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垒酬。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出伤溉,到底是詐尸還是另有隱情般码,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布乱顾,位于F島的核電站板祝,受9級特大地震影響,放射性物質發(fā)生泄漏走净。R本人自食惡果不足惜券时,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伏伯。 院中可真熱鬧橘洞,春花似錦、人聲如沸说搅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弄唧。三九已至适肠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間候引,已是汗流浹背侯养。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澄干,地道東北人逛揩。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像麸俘,于是被迫代替她去往敵國和親辩稽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容

  • 反射 一徐紧、概要 注解對于開發(fā)人員來講既熟悉又陌生静檬,熟悉是因為只要你是做開發(fā),Java注解又稱為標注并级,是Java從1...
    唯老閱讀 318評論 0 0
  • 注解的概念 注解(Annotation)拂檩,也叫元數據(Metadata),是Java5的新特性嘲碧,JDK5引入了Me...
    啦啦啦啦啦哈1閱讀 171評論 0 0
  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,168評論 0 2
  • http://www.cnblogs.com/xdp-gacl/p/3622275.html 一稻励、認識注解 注解(...
    yangfhit閱讀 1,941評論 0 0
  • 注解,Annotation,是Java語言5.0版本引入的特性望抽。自誕生到現在加矛,Java語言的項目中,注解出現的頻率...
    SpaceCat閱讀 649評論 0 2