@Retention是用來修飾註解的,它定義了該註解被保留時間的長短,是註解的註解,是JAVA元註解之壹。
註解有不同的 生命周期 ,按不同的生命周期可分為3類。
這三種生命周期分別對應於三種狀態。
而@Retention的作用就是用於 描述註解的生命周期 。
首先看壹下@Retention的源碼:
它只有壹個屬性值,RetentionPolicy的對象value。
這是壹個enum類型,裏面只有3個值SOURCE,CLASS,RUNTIME。@Retention就是靠這3個值來描述註解的生命周期。
從上表可知,@Deprecated是用RetentionPolicy.RUNTIME標記的,處理器是可以通過反射獲取@Deprecated的屬性的。
但是去看源碼,@Deprecated什麽屬性都沒有,處理器反射獲得屬性的行為也就沒什麽必要。
於是有了壹個想法, 為什麽壹定要RUNTIME,為什麽不用SOURCE或者CLASS呢?
@Deprecated是警告標記的壹些方法或類過時或者危險,有更好的可以替代,但 標記的方法或者類依舊可以用 。
這樣像@Override和@SupressWarnings壹樣編譯器檢查不就行了,為什麽還需要設置為RUNTIME。
為此,查詢了stackoverflow,這是投票最高的回答:
“壹些框架或者工具可以實例化對象來使用它們。
例如,許多JavaBean UI編輯器創建bean的實例,並在用戶操縱他們正在設計的UI時與它們進行交互。
通過在運行時使用@Deprecated註解,可以使用諸如此類的工具為用戶標記不贊成使用的方法,事件和屬性。”
恕我愚笨,想不出例子來驗證這句話,如果能解釋這句話或者有更好的想法請賜教。