註解@Retention能夠用來修飾註解,是註解的註解,稱爲元註解。
Retention註解有一個屬性value,是RetentionPolicy類型的,Enum RetentionPolicy是一個枚舉類型,
這個枚舉決定了Retention註解應該如何去保持,也可理解爲Rentention 搭配 RententionPolicy使用。RetentionPolicy有3個值:CLASS RUNTIME SOURCE
按生命週期來劃分可分爲3類:
一、RetentionPolicy.SOURCE:註解只保留在源文件,當Java文件編譯成class文件的時候,註解被遺棄;
二、RetentionPolicy.CLASS:註解被保留到class文件,但jvm加載class文件時候被遺棄,這是默認的生命週期;
三、RetentionPolicy.RUNTIME:註解不只被保存到class文件中,jvm加載class文件以後,仍然存在;
這3個生命週期分別對應於:Java源文件(.java文件) ---> .class文件 ---> 內存中的字節碼。
那怎麼來選擇合適的註解生命週期呢?
首先要明確生命週期長度 SOURCE < CLASS < RUNTIME ,因此前者能做用的地方後者必定也能做用。
通常若是須要在運行時去動態獲取註解信息,那隻能用 RUNTIME 註解,好比@Deprecated使用RUNTIME註解
若是要在編譯時進行一些預處理操做,好比生成一些輔助代碼(如 ButterKnife),就用 CLASS註解;
若是隻是作一些檢查性的操做,好比 @Override 和 @SuppressWarnings,使用SOURCE 註解。html
註解@Override用在方法上,當咱們想重寫一個方法時,在方法上加@Override,當咱們方法的名字出錯時,編譯器就會報錯
註解@Deprecated,用來表示某個類或屬性或方法已通過時,不想別人再用時,在屬性和方法上用@Deprecated修飾
註解@SuppressWarnings用來壓制程序中出來的警告,好比在沒有用泛型或是方法已通過時的時候java