【Java8新特性】重複註解與型別註解,你真的學會了嗎?
阿新 • • 發佈:2020-06-02
## 寫在前面
> 在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