JDK 5提供的注解,除了Retention以外,還有另外三個,即Target 、Inherited 和 Documented。
Target 目標即Target注解用在哪里, 定義了注解使用的時機,即注解所適用的程序元素的種類。如果注解類型聲明中不存在 Target 元注解,則聲明的類型可以用在任一程序元素上。如果存在這樣的元注解,則編譯器強制實施指定的使用限制。
Target 定義如下:
1
2
3
4
5
6
|
@Documented @Retention (RetentionPolicy.RUNTIME) @Target (ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); } |
可以看到,Target 只有一個value屬性,類型為枚舉類型ElementType。ElementType 聲明如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public enum ElementType { /** 注解可以用在類、接口(包括注解類型)或枚舉聲明 */ TYPE, /** 字段聲明(包括枚舉常量) */ FIELD, /** 方法聲明 */ METHOD, /** 參數(shù)聲明 */ PARAMETER, /** 構(gòu)造方法聲明 */ CONSTRUCTOR, /** 局部變量聲明 */ LOCAL_VARIABLE, /** 注解類型聲明 */ ANNOTATION_TYPE, /** 包聲明 */ PACKAGE } |
Documented注解表明制作javadoc時,是否將注解信息加入文檔。如果注解在聲明時使用了@Documented,則在制作javadoc時注解信息會加入javadoc。注解聲明如下:
1
2
3
4
|
@Documented @Retention (value=RUNTIME) @Target (value=ANNOTATION_TYPE) //說明該注解只能在聲明注解時使用,即元注解 public @interface Documented {} |
Inherited 注解同樣是元注解,聲明如下:
1
2
3
4
|
@Documented @Retention (value=RUNTIME) @Target (value=ANNOTATION_TYPE) public @interface Inherited {} |
Inherited 注解表明注解是否會被子類繼承,缺省情況是不繼承的。當注解在聲明時,使用了@Inherited注解,則該注解會被使用了該注解的類的子類所繼承。