java中有四種元注解:@Retention、@Inherited、@Documented、@Target
@Retention
注解的保留位置(枚舉RetentionPolicy),RetentionPolicy可選值:
SOURCE:注解僅存在於源碼中,在class字節碼文件中不包含
CLASS:默認的保留策略,注解在class字節碼文件中存在,但運行時無法獲得
RUNTIME:注解在class字節碼文件中存在,在運行時可以通過反射獲取到
@Inherited
聲明子類可以繼承此注解,如果一個類A使用此注解,則類A的子類也繼承此注解
@Documented
聲明注解能夠被javadoc等識別(下面自定義注解處會有例子做介紹,點擊查看)
@Target
用來聲明注解范圍(枚舉ElementType),ElementType可選值:
TYPE:接口、類、枚舉、注解
FIELD:字段、枚舉的常量
METHOD:方法
PARAMETER:方法參數
CONSTRUCTOR:構造函數
LOCAL_VARIABLE:局部變量
ANNOTATION_TYPE:注解
PACKAGE:包
自定義注解經常使用場景:
1.生成文檔.例如:@see,@param,@return 等
2.代替配置文件功能.例如spring基於注解的配置
3.在編譯時進行格式檢查。如@override 放在方法前,如果你這個方法並不是覆蓋了超類方法,則編譯時就能檢查出。
不經常使用的場景:
1.類屬性自動賦值
2.驗證對象屬性完整性
@Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @Target({ElementType.FIELD,ElementType.METHOD}) @interface MyAnno{ public String name() default "zhangsan"; public String email() default "hello@example.com"; }