-------
android培訓、java培訓、期待與您交流! ----------
(1)從JDk5開始,Java增加了對元素據(MetaData)的支持,也就是Annotation(註釋)。Annotation其實是代碼裏的特殊標記,這些標記可以在編譯、類加載、運行時被讀取並執行相應的處理。
基本Annotation
使用Annotation時要在其前面增加@符號,並把該Annotation當成一個修飾符使用,用於修飾它支持的程序元素。
(2)4個基本的Annotation如下:
@Override 限定重寫父類方法
@Deprecated 標記已過時
@SuppressWarnings 抑制編譯器警告
@SafeVarargs(JDK7新增)
註解相當於一種標記,在程序中加了註解就等於爲程序打上了某種標記,沒加,則等於沒有某種標記,以後,javac編譯器,開發工具和其他程序可以用反射來了解你的類及各種元素上有無何種標記,看你有什麼標記,就去幹相應的事。標記可以加在包,類,字段,方法,方法的參數以及局部變量上。
(3)自定義註解及其應用
1 定義一個最簡單的註解:public @interface MyAnnotation {}
2 把它加在某個類上:@MyAnnotation public class AnnotationTest{}
3 用反射進行測試AnnotationTest的定義上是否有@MyAnnotation
@Retention元註解三種取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;
分別對應:java源文件------------------------>class文件----------------->內存中的字節碼。
思考:@Override、@SuppressWarnings和@Deprecated這三個註解的屬性值分別是什麼?
(4)@Target元註解
Target的默認值爲任何元素,設置Target等於ElementType.METHOD,原來加在類上的註解就報錯了,改爲用數組方式設置 {ElementType.METHOD,ElementType.TYPE}就可以了。
元註解以及其枚舉屬性值不用記,只要會看jdk提供那幾個基本註解的API幫助文檔的定義或其源代碼,按圖索驥即可查到,或者直接看java.lang.annotation包下面的類。
爲註解增加基本屬性
什麼是註解的屬性
加了屬性的標記效果爲:@MyAnnotation(color="red")
定義基本類型的屬性和應用屬性:
在註解類中增加String color();
@MyAnnotation(color="red")
(5)用反射方式獲得註解對應的實例對象後,再通過該對象調用屬性對應的方法
MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color());
可以認爲上面這個@MyAnnotation是MyAnnotaion類的一個實例對象
爲屬性指定缺省值:
String color() default "yellow";
(6)value屬性:
String value() default "zxx";
如果註解中有一個名稱爲value的屬性,且你只想設置value屬性(即其他屬性都採用默認值或者你只有一個value屬性),那麼可以省略value=部分,例如:@MyAnnotation("lhm")。
爲註解增加高級屬性
數組類型的屬性
int [] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果數組屬性中只有一個元素,這時候屬性值部分可以省略大括
枚舉類型的屬性
EnumTest.TrafficLamp lamp() ;
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
註解類型的屬性:
MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )
可以認爲上面這個@MyAnnotation是MyAnnotaion類的一個實例對象,同樣的道理,可以認爲上面這個@MetaAnnotation是MetaAnnotation類的一個實例對象,調用代碼如下:
MetaAnnotation ma = myAnnotation.annotationAttr();
System.out.println(ma.value());
註解的詳細語法可以通過看java語言規範瞭解,即看java的language specification。