注解簡介
注解,可以看作是對一個類/方法的一個擴展的模版,每個類/方法按照注解類中的規則,來為類/方法注解不同的參數,在用到的地方可以得到不同的類/方法中注解的各種參數與值。
從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