@Retention注解簡單說明
是什么:
@Retention是用來修飾注解的邦邦,它定義了該注解被保留時間的長短安吁,是注解的注解,是JAVA元注解之一圃酵。
為什么:
注解有不同的生命周期柳畔,按不同的生命周期可分為3類。
1.某些注解只保存在源文件中郭赐,當.java文件翻譯成.class文件薪韩,該注解就被遺棄。
2.某些注解只保留到.class文件捌锭,但JVM加載.class文件時俘陷,該注解會被遺棄。
3.某些注解在.class被裝載時將被讀取观谦,在程序運行期間拉盾,將一直保留。
這三種生命周期分別對應于三種狀態(tài)豁状。
1..java文件
2..class文件
3.內存中的字節(jié)碼
而@Retention的作用就是用于描述注解的生命周期捉偏。
怎么用:
首先看一下@Retention的源碼:
它只有一個屬性值,RetentionPolicy的對象value泻红。
這是一個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什么屬性都沒有,處理器反射獲得屬性的行為也就沒什么必要绩聘。
于是有了一個想法沥割,為什么一定要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注解,可以使用諸如此類的工具為用戶標記不贊成使用的方法预茄,事件和屬性兴溜≌旌瘢”
恕我愚笨耻陕,想不出例子來驗證這句話,如果能解釋這句話或者有更好的想法請賜教刨沦。