1. 程式人生 > >【Java8新特性】重複註解與型別註解,你真的學會了嗎?

【Java8新特性】重複註解與型別註解,你真的學會了嗎?

## 寫在前面 > 在Java8之前,在某個類或者方法,欄位或者引數上標註註解時,同一個註解只能標註一次。但是在Java8中,新增了重複註解和型別註解,也就是說,從Java8開始,支援在某個類或者方法,欄位或者引數上標註多個相同的註解。那麼,有讀者就會問了:如何實現呢?別急,往下看!文中不只是Java8中的註解。 ## JDK5中的註解 ### 1.註解(@) 註解就相當於一種標記,在程式中加了註解就等於為程式加了某種標記。(JDK1.5新特性)。 ### 2.作用 告訴javac編譯器或者java開發工具……向其傳遞某種資訊,作為一個標記。 ### 3.如何理解註解? 一個註解就是一個類。 標記可以加在包、類、欄位、方法,方法引數以及區域性變數上。可以同時存在多個註解。 每一個註解結尾都沒有“;”或者其他特別符號。 定義註解需要的基礎註解資訊如下所示。 ```java @SuppressWarnings("deprecation") //編譯器警告過時(source階段) @Deprecated //過時(Runtime階段) @Override //重寫(source階段) @Retention(RetentionPolicy.RUNTIME) //保留註解到程式執行時。(Runtime階段) @Target({ElementType.METHOD,ElementType.TYPE}) //標記既能定義在方法上,又能定義在類、介面、列舉上等。 ``` **注意:** 1)添加註解需要有註解類。RetentionPolicy是一個列舉類(有三個成員)。 2)Target中可以存放陣列。它的預設值為任何元素。 * ElementType.METHOD:表示只能標記在方法上。 * ElementType.TYPE:表示只能標記定義在類上、介面上、列舉上等 3)ElementType也是列舉類。成員包括:ANNOTATION_TYPE(註解)、CONSTRUCTOR(構造方法)、FIEID(成員變數)、LOCAL_VARIABLE(變數)、METHOD(方法)、PACKAGE(包)、PARAMETER(引數)、TYPE。 ### 4.關於註解 * 元註解:註解的註解(理解:給一個註解類再加註解) * 元資料:資料的資料 * 元資訊:資訊的資訊 ### 5.註解分為三個階段 java原始檔--> class檔案 --> 記憶體中的位元組碼。 Retention的註解有三種取值:(分別對應註解的三個階段) * RetentionPolicy.SOURCE * RetentionPolicy.CLASS * RetentionPolicy.RUNTIME 注意:註解的預設階段是Class。 ### 6.註解的屬性型別 原始型別(就是八個基本資料型別)、String型別、Class型別、陣列型別、列舉型別、註解型別。 ### 7.為註解增加屬性 value:是一個特殊的屬性,若在設定值時只有一個value屬性需要設定或者其他屬性都採用預設值時 ,那麼value=可以省略,直接寫所設定的值即可。 ```java 例如:@SuppressWarnings("deprecation") 為屬性指定預設值(預設值): 例如:String value() default "blue"; //定義在註解類中 陣列型別的屬性: 例如:int[] arrayArr() default {3,4,5,5};//定義在註解類中 SunAnnotation(arrayArr={3,9,8}) //設定陣列值 注意:如果陣列屬性中只有一個元素時,屬性值部分可以省略大括號。 例如:SunAnnotation(arrayArr=9) 列舉型別的屬性: 例如:EnumDemo.TrafficLamp lamp() ////列舉型別屬性, 定義在註解類中,這裡使用了自定義的列舉類EnumDemo.java並沒有給出相關程式碼,這裡只是舉個例子 default EnumDemo.TrafficLamp.RED; 註解型別的屬性: 例如:MetaAnnotation annotationAttr() //定義在一個註解類中,並指定預設值, //此屬性關聯到註解類:MetaAnnotation.java, default @MetaAnnotation("lhm"); //設定註解屬性值 @SunAnnotation(annotationAttr=@MetaAnnotation("flx")) ``` ## Java8中的註解 對於註解(也被稱做元資料),Java 8 主要有兩點改進:型別註解和重複註解。 ### 1.型別註解 1)Java 8 的型別註解擴充套件了註解使用的範圍。 在java 8之前,註解只能是在宣告的地方所使用,java8開始,註解可以應用在任何地方。 例如: 建立類例項 ```java new @Interned MyObject(); ``` 型別對映 ```java myString = (@NonNull String) str; ``` implements 語句中 ```java class Unmodifi