標籤:png ati 安全 技術分享 parameter 編譯器 field inter 附加
1 、註解的定義
Annontation是Java5開始引入的新特徵,中文名稱叫註解。它提供了一種安全的類似注釋的機制,用來將任何的資訊或中繼資料(metadata)與程式元素(類、方法、成員變數等)進行關聯。為程式的元素(類、方法、成員變數)加上更直觀更明了的說明,這些說明資訊是與程式的商務邏輯無關,並且供指定的工具或架構使用。Annontation像一種修飾符一樣,應用於包、類型、構造方法、方法、成員變數、參數及本地變數的聲明語句中。
Java註解是附加在代碼中的一些元資訊,用於一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。註解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annotation 包中。
1.1 元註解
java.lang.annotation提供了四種元註解,專門註解其他的註解(在自訂註解的時候,需要使用到元註解):
@Documented –註解是否將包含在JavaDoc中
@Retention –什麼時候使用該註解
@Target –註解用於什麼地方
@Inherited – 是否允許子類繼承該註解
@Retention– 定義該註解的生命週期
● RetentionPolicy.SOURCE : 在編譯階段丟棄。這些註解在編譯結束之後就不再有任何意義,所以它們不會寫入位元組碼。@Override, @SuppressWarnings都屬於這類註解。
● RetentionPolicy.CLASS : 在類載入的時候丟棄。在位元組碼檔案的處理中有用。註解預設使用這種方式
● RetentionPolicy.RUNTIME : 始終不會丟棄,運行期也保留該註解,因此可以使用反射機制讀取該註解的資訊。我們自訂的註解通常使用這種方式。
非常關鍵,預設設定反射是擷取不到的,設定成RUNTIME在運行時可以擷取
Target – 表示該註解用於什麼地方
預設值為任何元素,表示該註解用於什麼地方。可用的ElementType參數包括
● ElementType.CONSTRUCTOR:用於描述構造器
● ElementType.FIELD:成員變數、對象、屬性(包括enum執行個體)
● ElementType.LOCAL_VARIABLE:用於描述局部變數
● ElementType.METHOD:用於描述方法
● ElementType.PACKAGE:用於描述包
● ElementType.PARAMETER:用於描述參數
● ElementType.TYPE:用於描述類、介面(包括註解類型) 或enum聲明
@Documented–表示是否將註解資訊添加在java文檔中@Inherited – 定義該注釋和子類的關係
@Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的類型是被繼承的。如果一個使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將被用於該class的子類。
1.2 內建註解
Deprecated 註解
可以修飾類、方法、變數,在java源碼中被@Deprecated修飾的類、方法、變數等表示不建議使用的,可能會出現錯誤的,可能以後會被刪除的類、方法等,如果現在使用,則在以後使用了這些類、方法的程式在更新新的JDK、jar包等就會出錯,不再提供支援。
個人程式中的類、方法、變數用@Deprecated修飾同樣是不希望自己和別人在以後的時間再次使用此類、方法。當編譯器編譯時間遇到了使用@Deprecated修飾的類、方法、變數時會提示相應的警告資訊。
Override 註解
指明被註解的方法需要覆寫超類中的方法,如果某個方法使用了該註解,卻沒有覆寫超類中的方法(如大小寫寫錯了,或者參數錯了,或者是子類自己定義的方法),編譯器就會產生一個錯誤。
在子類中重寫父類或介面的方法,@Overide並不是必須的。但是還是建議使用這個註解,在某些情況下,假設你修改了父類的方法的名字,那麼之前重寫的子類方法將不再屬於重寫,如果沒有@Overide,你將不會察覺到這個子類的方法。有了這個註解修飾,編譯器則會提示你這些資訊。
Suppresswarnings 註解
@SuppressWarnings用來抑制編譯器產生警告資訊,可以修飾的元素為類,方法,方法參數,屬性,局部變數。它可以達到抑制編譯器編譯時間產生警告的目的,使用@SuppressWarnings註解,採用就近原則,比如一個方法出現警告,盡量使用@SuppressWarnings註解這個方法,而不是註解方法所在的類。所屬範圍越小越好,因為範圍大了,不利於發現該類下其他方法的警告資訊。
但是很不建議使用@SuppressWarnings註解,使用此註解,開發人員看不到編譯時間編譯器提示的相應的警告,不能選擇更好、更新的類、方法或者不能編寫更規範的編碼。同時後期更新JDK、jar包等源碼時,使用@SuppressWarnings註解的代碼可能受新的JDK、jar包代碼的支援,出現錯誤,仍然需要修改。
2、 註解的建立
package main.java.com.nf147.annot;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Animal { String name() default ""; String sex() default "公"; int age() default 0; // 1. 建立的文法跟介面非常像 // 2. 可以通過 default 語句給與預設值}3、註解的使用
1. 首先,在需要的地方,添加註解
package com.nf147.ioc;import com.nf147.annot.Animal;@Animal(name = "伊麗莎白", sex = "母", age = 1)public class Dog { public void introduce(){ System.out.println("大家好,我是伊麗莎白"); }}
2. 通過反射擷取註解資訊
三個重要的方法:
- isAnnotationPresent()
- getAnnotation()
- getAnnotations()
package com.nf147.web;import com.nf147.annot.Animal;import com.nf147.ioc.Dog;import org.junit.Test;public class DogTest { @Test public void dogTest(){ Class dogClass = Dog.class; if (dogClass.isAnnotationPresent(Animal.class)) { Animal anno = (Animal) dogClass.getAnnotation(Animal.class); String name = anno.name(); String sex = anno.sex(); int age = anno.age(); System.out.println("我是"+name+",今年"+age+"歲"); } }}
Annotation 註解快速入門