定義注解Annotation
使用@interface
定義注解
例子:
@Retention(RetentionPolicy.RUNTIME)//通常我們自定義的Annotation都是RUNTIME
@Target(ElementType.METHOD, ElementType.FIELD) //定義注解@Report可用在方法或字段上
public @interface Report {
int type() default 0;
}
- 注解的參數(shù)類似于無參數(shù)的方法蝇更,可以用
default
設(shè)定一個默認(rèn)值
元注解meta annotation
元注解是可以用來修飾其他注解的
1. @Target
用來定義Annotation能夠被應(yīng)用在源碼的哪些位置沪编、
- 類/接口:
ElementType.TYPE
- 字段:
ElementType.FIELD
- 方法:
ElementType.METHOD
- 構(gòu)造函數(shù):
ElementType.CONSTRUCTOR
- 方法參數(shù):
ElementType.PARAMETER
2. @Retention
用來定義Annotation的生命周期
- 僅編譯期:
RetentionPolicy.SOURCE
- 僅class文件:
RetentionPolicy.CLASS
- 運行期:
RetentionPolicy.RUNTIME
若Retention不存在,則annotation默認(rèn)為class
3. @Repeatable
用來定義annotation可以重復(fù)
經(jīng)過該注解修飾后年扩,在某個類型的聲明處蚁廓,可以添加多個annotation
4. @Inherited
- 用來定義子類是否可以繼承父類定義的annotation
- 僅針對
@Target(ElementType.TYPE)
類型的annotation有效 - 僅針對class的繼承,對interface無效
使用自定義注解
- 只討論如何讀取RUNTIME類型的注解
- 反射API
- 判斷某個注解是否存在于class/field/method/constructor中:
Class.isAnnotationPresent(Class)
/Field.isAnnotationPresent(Class)
/Method.isAnnotationPresent(Class)
/Constructor.isAnnotationPresent(Class)
- 讀取Annotation:
Class.getAnnotation(Class)
/Field.getAnnotation(Class)
/Method.getAnnotation(Class)
/Constructor.getAnnotation(Class)
- 判斷某個注解是否存在于class/field/method/constructor中: