@Retention 僅被用於描述註解的生命週期
下面是Retention註解的定義
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}
在它的定義代碼中,僅僅存在一個屬性 RetentionPolicy
其中 RetentionPolicy 包含三種值,分別爲 1:SOURCE、2:CLASS、3:RUNTIME
public enum RetentionPolicy {
/**
* 註解只保留在源文件,當Java文件編譯成class文件的時候,註解被遺棄;
*/
SOURCE,
/**
* 註解被保留到class文件,但jvm加載class文件時候被遺棄,這是默認的生命週期;
*/
CLASS,
/**
* 註解不僅被保存到class文件中,jvm加載class文件之後,仍然存在;
* 如果要用反射的話,這是必須項
*/
RUNTIME
}
三者的生命週期長度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方後者一定也能作用。一般如果需要在運行時去反射獲取註解信息,那隻能用 RUNTIME 註解;