Annotation

Annotation

JDK5.0 引入的注釋機制
Java注解(Annotation)又稱Java标注,是JDK5.0引入的一種注釋機制。[1]注解也就是Annotation,相信不少人也和我之前一樣以為和注釋和doc一樣,是一段輔助性的文字,其實注解不是這樣的。
  • 中文名:注解
  • 外文名:Annotation
  • 别名:
  • 屬性:代碼裡的特殊标志
  • 基本注解:1.@Override2.@Deprecated3.@SuppressWarnings4.@SafeVarargs5.@FunctionalInterface

注解簡介

注解,可以看作是對一個類/方法的一個擴展的模版,每個類/方法按照注解類中的規則,來為類/方法注解不同的參數,在用到的地方可以得到不同的類/方法中注解的各種參數與值。

從JDK5開始,java增加了對元數據(描述數據屬性的信息)的支持。其實說白就是代碼裡的特殊标志,這些标志可以在編譯,類加載,運行時被讀取,并執行相應的處理,以便于其他工具補充信息或者進行部署。n

基本注解

java提供了5個基本的注解,分别是

1.@Override

2.@Deprecated

3.@SuppressWarnings

4.@SafeVarargs

5.@FunctionalInterface

限定父類重寫方法:@Override

當子類重寫父類方法時,子類可以加上這個注解,那這有什麼什麼用?這可以确保子類确實重寫了父類的方法,避免出現低級錯誤n

标示已過時:@Deprecated

這個注解用于表示某個程序元素類,方法等已過時,當其他程序使用已過時的類,方法時編譯器會給出警告(删除線,這個見了不少了吧)。n

抑制編譯器警告:@SuppressWarnings

被該注解修飾的元素以及該元素的所有子元素取消顯示編譯器警告,例如修飾一個類,那他的字段,方法都是顯示警告n

“堆污染”警告與@SafeVarargs

想理解這個就要明白什麼是堆污染,堆污染是什麼?

其實很好理解,就是把不帶泛型的對象賦給一個帶泛型的對象,為什麼不行?很簡單,因為不帶泛型的話,默認會給泛型設定為object,意思就是什麼類型都可以往裡面塞,那你一個不帶泛型的怎麼可能給一個帶泛型塞呢。

注意:可變參數更容易引發堆污染異常,因為java不允許創建泛型數組,可變參數恰恰是數組。

抑制這個警告的方法有三個:1.@SafeVarargs修飾引發該警告的方法或構造器2.使用@suppressWarnings("unchecked")3.編譯時使用-Xlint:varargs

函數式接口與@Functionallnterface

什麼是函數式?如果接口中隻有一個抽象方法(可以包含多個默認方法或多個static方法)

接口體内隻能聲明常量字段和抽象方法,并且被隐式聲明為public,static,final。

接口裡面不能有私有的方法或變量

這個注解有什麼用?這個注解保證這個接口隻有一個抽象方法,注意這個隻能修飾接口n

方法信息

equals boolean equals(Object obj)如果指定的對象表示在邏輯上等效于此接口的注釋,則返回true。換句話說,如果指定對象是一個與此實例相同的annotation類型的實例,即其所有成員都與此實例中所對應的成員相等,則返回true,具體說明如下:

如果x==y,則認為值分别為x和y的兩個對應的基本類型成員相等,除非它們的類型是float或double。

如果Float.valueOf(x).equals(Float.valueOf(y))為真,則認為值分别為x和y的兩個對應的float成員相等。(與==運算符不同,NaN被認為等于其自身,并且0.0f不等于-0.0f。)

如果Double.valueOf(x).equals(Double.valueOf(y))為真,則認為值分别為x和y的兩個對應的double成員相等。(與==運算符不同,NaN被認為等于其自身,并且0.0不等于-0.0。)

如果x.equals(y)為真,則認為值分别為x和y的兩個對應的String、Class、enum或annotation類型的成員相等。(注意,此定義對于annotation類型的成員是遞歸的。)

對于适當重載的Arrays.equals(long[],long[]),如果Arrays.equals(x,y)為真,則認為兩個對應的數組類型的成員x和y相等。

處理器

通過annotation processing tool(注釋處理工具,簡稱apt),可以處理源碼中的注釋,獲得更靈活的代碼,也将程序員從樣闆式的編程中解放了出來。

為了使注釋(annotation)中的信息能在運行時(RUNTIME)被程序利用,在創建注釋時,應該給注釋的類名添加@Retention(RetentionPolicy.RUNTIME)注釋。

構建自定義注釋信息處理器與以下API有關:

Mirror API(已過時Deprecated)

javax.annotation.processing

javax.lang.model

javax.lang.model.element

javax.lang.model.type

javax.lang.model.util

相關詞條

相關搜索

其它詞條