JDK5新特性---注解學習筆記(一)
1.注解(也被稱為元數據):為我們在代碼中添加信息提供了一種形式化的方法,使我們可以在稍後某個時刻非常方便的使用這些數據。
2. javaSE內置了3種標準注解:
@Override 表示當前的方法定義將覆蓋超類中的方法。如果你不小心拚寫錯誤,或者方法簽名對不上被覆蓋的方法,編譯器就會發出錯誤的提示。
@Deprecated 如果程序員使用了注解為它的元素,那麼編譯器會發出警告信息。
@SuppressWarnings 關閉不當的編譯器警告信息。
在我們覆蓋父類中的方法時,最好使用@Override注解,這樣會避免出現一些未知錯誤,否則當你方法名稱或者方法簽名出現問題時,程序會將其處理為一個新的方法,而用了此注解以後,如果不小心出現了上述的錯誤,那麼編譯器將會給予提示,幫助我們正確的編碼。
當我們使用了@Deprecated這一注解在我們所寫的方法時,編譯器將會發出警告,提示我們這個方法已經過時,樣式為在方法的名稱上出現橫線。
@SuppressWarnings這個注解可以被理解成為壓製警告,當我們忘記使用泛型時,編譯器會給予警告,告訴我們還沒有確定類型,這個時候我們不想製定具體的泛型類型,也不想讓編譯器給予警告,那麼我們可以采用該注解來壓製警告,這個注解可以作用在方法級別上也可以做用在類級別上。
3. 注解元素:
注解元素隻可以作用在以下類型:
(1)8大基本數據類型
(2)String類型
(3)Class類型
(4)enum類型
(5)Annotation類型
(6)以上類型的一維數組類型
如果你使用了其它的類型--包括包裝類型,那麼編譯器將會報錯。
4. 注解定義及元素定義
(1)注解MyAnno1
package com.ty.annotation;
public @interface MyAnno1 {
String name() default "wht";
int age();
Class<Person> person();
Gender gender();
int[] array();
}
(2)注解MyAnno2
package com.ty.annotation;
public @interface MyAnno2 {
String value() ;
}
(3)枚舉類型
package com.ty.annotation;
public enum Gender {
MALE,FEMALE;
}
(4)類類型
package com.ty.annotation;
public class Person {
}
(5)測試使用注解
package com.ty.annotation;
public class Test {
@MyAnno1(age=18,person=Person.class,gender=Gender.FEMALE,array={1,2,3})
@MyAnno2("abc")
public void testAnno(){
}
}
注意的幾個問題:
1. 當注解的元素沒有默認值的時候,在使用的時候必須為其指定初始值
2. 如果注解元素有了初始值,那麼在使用的時候可以為其賦新的值,否則將使用默認值
3. 一個較為特殊的情況:注解元素當且僅當其隻有一個元素且名稱為value時,在使用該注解的時候為其賦值時可以不用寫屬性(元素)名稱
5. 元注解
java內置了4種元注解,元注解負責注解其它的注解,可以理解成java中用來注解 Annotation的Annotation
@Retention
在描述這一屬性之前,先來說一下jav a文件的三個時期: 源文件時期(**.java)----->編譯器編譯期(***.class)----->jvm運行時期
隻能用於修飾一個Annotation的定義,表示需要在什麼域級別上保存該注解的信息。通俗的說就是該注解保留在的作用域,其RetentionPolicy的參數包括:
SOURCE 表示該注解隻作用於源代碼時期,最終將被編譯器所拋棄
CLASS 表示該注解在class文件中可用,但是會被VM拋棄 --------->注解默認的作用域
RUNTIME 表示該注解在VM運行時期也會被保留,因此可以通過反射機製來讀取注解的信息。
@target
表示該注解可以作用在什麼地方,可能的ElementType參數包括:
CONSTRUCTOR: 構造器的聲明
FIELD: 字段的聲明(域聲明--包括enum實例)
LOCAL_VARIABLE 局部變量的聲明
MRTHOD 方法聲明
PACKAGE 包聲明
PARAMETER 參數聲明
TYPE 類、接口(包括注解類型)、或enum聲明
@Documented
表示該注解會被包含在javadoc中
@Inherited
表示該注解可以被繼承。詳細的說的就是一個注解@A在聲明時使用了@Inherited,那麼我們用@A作用於一個類的時候,當這個類被繼承時,子類也默認的帶有@A注解。
最後更新:2017-04-02 06:51:52