JAVA從J2SE5開始提供名為annotation(注釋,標(biāo)注)的功能。Java的annotation,可以附加在package, class, method, field等上面,相當(dāng)于給它們添加了額外的輔助信息。附加在package, class, method, field等上的Annotation,如果沒有外部解析工具等對其加以解析和處理的情況,本身不會對Java的源代碼或class等產(chǎn)生任何影響,也不會對它們的執(zhí)行產(chǎn)生任何影響。
但借助外部工具,比如javac,EJB容器等,可以對附加在package, class, method, field的annotation進(jìn)行解析,可以根據(jù)annotation而做出相應(yīng)的處理,比如運(yùn)行時(shí)改變對象/方法的行為。
Java標(biāo)準(zhǔn)Annotation
@Deprecated 相當(dāng)于Javadoc的@deprecated,被@Deprecated標(biāo)注的對象class, method等被注明為不推薦使用。主要用于javac等編譯工具。@Override 注明對象method重載了父類的方法。javac等編譯工具編譯時(shí)會根據(jù)此Annotation判斷重載方法是否正確。
@SuppressWarnings 告訴javac等編譯器忽略所指定的特定的警告信息。
@Target 被定義的annotation可以附加在那些對象上。
@Retention annotation的作用期間。
Java標(biāo)準(zhǔn)Annotation的使用
@Deprecated:@Deprecated
public class TestBean {
…
}
@SuppressWarningspublic class TestBean {
…
}
@SuppressWarnings("serial")
public class TestBean implements java.io.Serializable {
…
}
@SuppressWarnings(value = {"serial", "unchecked"})
public String doSth() {
…
}
public class TestBean implements java.io.Serializable {
…
}
@SuppressWarnings(value = {"serial", "unchecked"})
public String doSth() {
…
}
@Override
@Override
public String doSth() {
…
}
public String doSth() {
…
}
Annotation的定義
定義方法:@interface Annotation名 {定義體}
定義例1:
public @interface MyAnnotation {}
該例定義了一個(gè)無任何屬性/方法的Annotation。定義例2:
public @interface MyAnnotation {
public String value();
}
該例定義了只有一個(gè)方法為value()的Annotation。一般來說,只有一個(gè)方法的Annotation,方法名一定定義為value。public String value();
}
定義例3:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
public String value();
public String [] multiValues();
int number() default 0;
}
該例定義了一個(gè)具有多方法的Annotation。并設(shè)置其中一個(gè)方法number的默認(rèn)值為0。multiValues 方法定義為數(shù)組類型。Annotation定義可以用MetaAnnotation(元注釋)修飾。MetaAnnotation有以下2個(gè):@Target(ElementType.METHOD)
public @interface MyAnnotation {
public String value();
public String [] multiValues();
int number() default 0;
}
@Retention
@Target
我們將在以下對@Retention與@Target加以說明。
@Retention
@Retention 可以設(shè)置為RetentionPolicy類型的值。例:
@Retention(RetentionPolicy.RUNTIME)
RetentionPolicy的值 | 說明 |
---|---|
RetentionPolicy.CLASS | annotation信息將被編譯器編譯時(shí)保存在class文件中,但執(zhí)行時(shí)不會在VM裝載。也就是說不能在執(zhí)行時(shí)動態(tài)取得annotation信息。未設(shè)置@Retention時(shí)這將是默認(rèn)設(shè)置值。 |
RetentionPolicy.RUNTIME | annotation信息將被編譯器編譯時(shí)保存在class文件中,執(zhí)行時(shí)也會被VM裝載。 |
RetentionPolicy.SOURCE | annotation信息將被編譯器編譯時(shí)舍棄掉。 |
@Target
@Target表明Annotation可以附加在哪種JAVA元素之上,可以設(shè)置為java.lang.annotation.ElementType數(shù)組類型的值。使用例1:
@Target(ElementType.METHOD)
使用例2:
@Target(value={ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD})
ElementType是一個(gè)枚舉類型,它具有以下定義:
ElementType值 | 說明 |
---|---|
ElementType.ANNOTATION_TYPE | 應(yīng)用于其他注解的元注解 |
ElementType.CONSTRUCTOR | 構(gòu)造函數(shù) |
ElementType.FIELD | 字段 |
ElementType.LOCAL_VARIABLE | 方法中的本地變量 |
ElementType.METHOD | 方法 |
ElementType.PACKAGE | 包 |
ElementType.PARAMETER | 方法的參數(shù) |
ElementType.TYPE | 類,接口或者枚舉聲明 |