@Retention --表示其被修飾的注解保留的時間
1 進(jìn)入源碼:
public @interface Retention {
RetentionPolicy value();
}
可見搀庶,其有一個屬性value。進(jìn)入RetentionPolicy:
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
(1)可知value值有三個哥倔,SOURCE代表被@Retention修飾的注解只在源碼階段保留,不會被編譯咆蒿。用于做一些檢查性的操作,比如 @Override 和 @SuppressWarnings(壓制程序中出來的警告)
(2)CLASS代表可以被編譯而生成.class文件蚂子,但不會被JVM執(zhí)行,如果一個注解上沒有寫@Retention
這個注解缆镣,則默認(rèn)為@Retention(RetentionPolicy.CLASS)
,用在當(dāng)編譯時進(jìn)行一些預(yù)處理操作董瞻,如生成一些輔助代碼。
(3)RUNTIME代表可以被JVM執(zhí)行钠糊,當(dāng)需要在運(yùn)行時動態(tài)獲取注解信息(比如通過反射)時選擇此策略。如@Deprecated
,用來表示某個類或?qū)傩曰蚍椒ㄒ呀?jīng)過時抄伍,不想別人再用時,前用@Retention (RetentionPolicy.RUNTIME)
修飾截珍。
2 通過源碼可以看到,@Retention注解上有一行@Target(ElementType.ANNOTATION_TYPE)
修飾岗喉,表明他只可以用來修飾注解秋度。