一,Annotation(註解) 概述java
,Annotation 其實就是代碼裏的特殊標記, 它用於替代配置文件,也就是說,傳統方式經過配置文件告訴類如何運行,有了註解技術後,開發人員能夠經過註解告訴類如何運行數組
三個基本的 Annotation: ide
•@Override: 限定重寫父類方法, 該註解只能用於方法 工具
•@Deprecated: 用於表示某個程序元素(類, 方法等)已過期 spa
•@SuppressWarnings: 抑制編譯器警告. .net
二,自定義 Annotationcode
1,方法:繼承
定義Annotation 使用 @interface 關鍵字:(做用,原來寫在配置文件中的信息,能夠經過註解描述)內存
2,支持的類型:
開發
•註解屬性的類型只能是以下類型:
String類型 8大基本數據類型 Class類型 枚舉類型 註解類型 以上類型的一維數組
代碼(定義註解):
public @interface MyAnnotation { //支持的能夠配置的類型 String name() default "flx";//聲明註解的屬性,默認 "flx" int age() default 35; Gender gender() default Gender.MALE; Class clazz() default String.class;//配置一個類 MyAnnotation2 my2() default @MyAnnotation2(name="fsq");//註解中的註解,實現一些嵌套配置 String [] args() default {"11","222"}; //還支持以上類型的一維數組 }
代碼(使用註解):
@MyAnnotation(name="zxx",age=38,gender=Gender.FEMALE,clazz=String.class,my2=@MyAnnotation2(name="zc"),args={"111"}) public void test3(){ }
•有若是一個註解只有一個屬性,而且這個屬性的名稱爲value的話,那麼使用註解時能夠省略value=部分,如@MyAnnotation(「xxx"),直接賦值
3、JDK 的元 Annotation
元 Annotation指修飾Annotation的Annotation
JDK中定義了以下元Annotation:
@Retention: 只能用於修飾一個 Annotation 定義, 用於指定該 Annotation 能夠保留的域, @Rentention 包含一個 RetentionPolicy 類型的成員變量, 經過這個變量指定域。
•RetentionPolicy.CLASS: 編譯器將把註解記錄在 class 文件中. 當運行 Java 程序時, JVM 不會保留註解. 這是默認值 •RetentionPolicy.RUNTIME:編譯器將把註釋記錄在 class 文件中. 當運行 Java 程序時, JVM 會保留註解. 程序能夠經過反射獲取該註釋 •RetentionPolicy.SOURCE: 編譯器直接丟棄這種策略的註釋
代碼(聲明運行時 註解):
@Retention(RetentionPolicy.RUNTIME)//加元註解,將註解聲明爲運行時註解 public @interface MyAnnotation {////若是註解不加說明的話,註解是做用在class上的,但當虛擬機將class加載到內存以後,會拋棄這個註解 //支持的能夠配置的類型 String name() default "flx";//聲明註解的屬性,默認 "flx" int age() default 35; Gender gender() default Gender.MALE; Class clazz() default String.class;//配置一個類 MyAnnotation2 my2() default @MyAnnotation2(name="fsq");//註解中的註解,實現一些嵌套配置 String [] args() default {"11","222"}; //還支持以上類型的一維數組 }
@Target :指定註解用於修飾類的哪一個成員. @Target 包含了一個名爲 value,類型爲ElementType的成員變量。
代碼:
@Target({ElementType.METHOD,ElementType.FIELD})//若是沒有聲明,會做用於類的全部成員 public @interface MyAnnotation {////若是註解不加說明的話,註解是做用在class上的,但當虛擬機將class加載到內存以後,會拋棄這個註解 //支持的能夠配置的類型 String name() default "flx";//聲明註解的屬性,默認 "flx" int age() default 35; Gender gender() default Gender.MALE; Class clazz() default String.class;//配置一個類 MyAnnotation2 my2() default @MyAnnotation2(name="fsq");//註解中的註解,實現一些嵌套配置 String [] args() default {"11","222"}; //還支持以上類型的一維數組 }
l@Documented: 用於指定被該元 Annotation 修飾的 Annotation 類將被 javadoc 工具提取成文檔.
l@Inherited: 被它修飾的 Annotation 將具備繼承性.若是某個類使用了被 @Inherited 修飾的 Annotation, 則其子類將自動具備該註解
代碼:
@Inherited//使用MyAnnotation註解的類在被子類繼承時,註解的信息也被繼承 public @interface MyAnnotation {////若是註解不加說明的話,註解是做用在class上的,但當虛擬機將class加載到內存以後,會拋棄這個註解 //支持的能夠配置的類型 String name() default "flx";//聲明註解的屬性,默認 "flx" int age() default 35; Gender gender() default Gender.MALE; Class clazz() default String.class;//配置一個類 MyAnnotation2 my2() default @MyAnnotation2(name="fsq");//註解中的註解,實現一些嵌套配置 String [] args() default {"11","222"}; //還支持以上類型的一維數組 }