標籤:
一、Java中註解Annotation
什麼是註解:用來描述資料的資料(中繼資料)。
Java代碼裡的特殊標記。它為代碼中添加用Java程式無法表達的額外資訊提供一種形式化的方法,使用我們可以在未來的某一個時刻方便的使得這些註解修飾的程式元素。
作用:
用將由編譯器來測試和驗證的格式,儲存有關程式額外資訊
產生 描述符檔案,甚至是新的類定義
減輕編寫模板代碼的負擔
使代碼更加乾淨易讀
註解和注釋不同
註解與普通的代碼注釋有一定的區別,也有一定的聯絡。註解和注釋都屬於對代碼的描述;
注釋的作用只是簡單的描述程式的資訊,它不會被程式所讀取;
註解則是Java代碼中的特殊標記,這些標記可以在編譯、類載入、運行時被讀取,並執行相應的處理
通過使用註解,程式開發人員可以在不改變原有邏輯的情況下在源檔案中嵌入一些補充的資訊,程式碼分析工具、開發工具和部署工具可以通過這些補充資訊進行驗證或者部署。
二、註解文法
使用註解時要在基前面加“@” 符號,同時將註解作為修飾符使用
所有的註解都繼承了java.lang.annotation包下的Annotation介面
註解文法規範
- 將註解放在所有修飾符之前
- 通常將註解單獨放置在一行
- 預設情況下,註解可用於修飾任何元素,包括類,方法,成員,變數等。
三、註解類型
內建註解(也稱為基本註解),定義於java.lang包下
- 限定重寫父類方法:@Override
- 標示已經過時:@Deprecated
- 抑制編譯器警告:@SupperssWarnings
元註解(Meta Annotation)
- @Retention
- @Target
- @Documented
- @Inherited
自訂註解
使用@interface自訂註解
@Override
@Override只能用於修飾方法,而不能修飾其它的元素。
@Deprecated註解
private String name; private String pwd; //標示這個屬性已經過時,會在這個屬性或者方法 名上加上刪除線 @Deprecated private int age; @Deprecated public String getName() { return name; }
@SuppressWarnings
@SuppressWarnings("unused") public static void main(String[] args) { //沒有定義泛型 @SuppressWarnings("rawtypes") List list=new ArrayList();
四、元註解
元註解用來修飾其它的註解位於java.lang.annotation下
元註解(Meta Annotation)
- @Retention:用於指定被修飾的註解可以保留多長時間,包含一個RetentionPolicy類型的value成員變數,使用Retetion時必須為該value成員變數指定值
- @Target:有唯一的value作為成員變數,value的類型為java.lang.annotation.ElementType[]是被標註的枚舉類型
- @Documented:用於指定被修飾的註解將被javadoc工具提取成文檔,沒有成員變數
- @Inherited:用於指定被修改的註解將具有繼承性
五、自訂註解
使用@interface 關鍵字
註解類型和介面的相似之處
都可以定義常量,靜態成員(如枚舉類型定義)。註解類型也可以像介面一樣被實現或者被繼承
package com.pb.annotation.diy;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** *自訂註解需要使用@interface關鍵字 * *///設定註解可以為javadoc擷取為協助文檔@Documented/* * @Retention有如下參數(註解的生命週期) * RetentionPolicy.SOURCE:註解被編譯器丟棄 * RetentionPolicy.CLASS:註解儲存在class類當中,被虛擬機器忽略 * RetentionPolicy.RUNTIME:註解被儲存在class類當中,被虛擬機器讀取 * */@Retention(RetentionPolicy.RUNTIME)/* * target 有如下參數: * TYPE : 註解目標是類、介面 * FIELD: 註解目標是欄位 * METHOD:註解目標是方法 * PARAMETER:註解目標是方法的參數 * CONSTRUCTOR:註解目標是建構函式 * LOCAL_VARIABLE:註解目標是局部變數 * */@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})/* * 可以被繼承 */@Inheritedpublic @interface MyAnnotation { //設定註解成員變數並賦初始值 String name() default "張三"; int age() default 21; }
讀取註解資訊
package com.pb.annotation.diy;import java.lang.annotation.Annotation;public class MyAnnotationTest { @MyAnnotation(name="Jack",age=32) public void getInfo(){ try { //擷取當前getInfo()方法中包含的所有註解 @MyAnnotation Annotation [] annos=MyAnnotationTest.class.getMethod("getInfo").getAnnotations(); //註解數組 for (Annotation an : annos) { if(an instanceof MyAnnotation){ System.out.println("an 是"+an); System.out.println("註解中的name:"+((MyAnnotation) an).name()); System.out.println("註解中的age:"+((MyAnnotation) an).age()); } } } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } } public static void main(String[] args) { MyAnnotationTest mt=new MyAnnotationTest(); mt.getInfo(); }}
Java從零開始學四十七(註解簡述)