1. 程式人生 > >java註解講解

java註解講解

一、註解
Annotation
  Annotation其實是程式碼裡的特殊標記,這些標記可以在編譯、類載入、執行時被讀取,並執行相應的處理。通過使用Annotation,程式開發人員可以在不改變原有邏輯的情況下,在原始檔嵌入一些補充資訊。程式碼分析工具、開發工具和部署工具可以通過這些補充資訊進行驗證或者進行部署。

  Annotation提供了一條為程式元素設定元資料的方法,從某些方面來看,Annotation就像修飾符一樣被使用,可用於修飾包、類、構造器、方法、成員變數、引數、區域性變數的宣告,這些資訊被儲存在Annotation的“name=value”對中。

  Annotation能被用來為程式元素(類、方法、成員變數等)設定元資料。值得指出的是:Annotation不能影響程式程式碼的執行,無論增加、刪除Annotation,程式碼都始終如一地執行。如果希望讓程式中的Annotation能在執行時起一定的作用,只有通過某種配套的工具對Annotation中的資訊進行訪問的處理,訪問和處理Annotation的工具統稱APT(Annotation Processing Tool)。
基本的Annotation:


  Annotation必須使用工具來處理,工具負責提取Annotation裡包含的元資料,工具還會根據這些元資料增加額外的功能。在系統學習新的Annotation語法之前,先看一下Java提供的三個基本Annotation的用法:使用Annotation時要在其前面增加@符號,並把該Annotation當成一個修飾符使用,用於修飾它支援的程式元素。

三個基本的Annotation如下:

       @Override 限定重寫父類的方法
       @Deprecated 標示已過時
       @SuppressWarnings 抑制編譯器警告

二、 自定義Annotation
       定義新的Annotation型別使用@interface關鍵字,它用於定義新的Annotation型別。定義一個新的Annotation型別與定義一個介面非常像,如下程式碼可定義一個簡單的Annotation:

public @interface Login {

}

定義了該Annotation之後,就可以在程式任何地方來使用該Annotation,使用Annotation時的語法非常類似於public、final這樣的修飾符。通常可用於修飾程式中的類、方法、變數、介面等定義,通常我們會把Annotation放在所有修飾符之前,而且由於使用Annotation時可能還需要為其成員變數指定值,因而Annotation長度可能比較長,所以通常把Annotation另放一行,如下程式所示:

/**
 * 定義一個Annotation
 */
public @interface Login {

}

class LoginTest{
    /**
     * 使用Annotation
     */
    @Login
   public void login(){

    }
}

Annotation不僅可以是這種簡單Annotation,Annotation還可以帶成員變數,Annotation的成員變數在Annotation定義中以無引數方法的形式宣告。其方法名和返回值定義了該成員的名字和型別。如下程式碼可以定義一個有成員變數的Annotation:

/**
 * 定義一個註解
 */
public @interface Login {
    //定義兩個成員變數
    String username();
    String password();
}

一旦在Annotation裡定義了成員變數之後,使用該Annotation時應該為該Annotation的成員變數指定值,如下程式碼所示:

/**
 * 定義一個註解
 */
public @interface Login {
    //定義兩個成員變數
    String username();
    String password();
}

class LoginTest{
    /**
     * 使用註解
     */
    @Login(username="lisi", password="111111")
    public void login(){

    }
}

我們還可以在定義Annotation的成員變數時為其指定初始值,指定成員變數的初始值可使用default關鍵字,如下程式碼:

/**
 * 定義一個註解
 */
public @interface Login {
    //定義兩個成員變數
    //以default為兩個成員變數指定初始值
    String username() default "zhangsan";
    String password() default "123456";
}

 如果為Annotation的成員變數指定了預設值,使用該Annotation則可以不為這些成員變數指定值,而是直接使用預設值。如下程式碼:
 

/**
 * 定義一個註解
 */
public @interface Login {
    //定義兩個成員變數
    //以default為兩個成員變數指定初始值
    String username() default "zhangsan";
    String password() default "123456";
}

class LoginTest{
    /**
     * 使用註解
   * 因為它的成員變數有預設值,所以可以無須為成員變數指定值,而直接使用預設值
     */
    @Login
    public void login(){

    }
}

使用@Retention
  @Retention只能用於修飾一個Annotation定義,用於指定該Annotation可以保留多長時間,@Retention包含一個RetentionPolicy型別的value成員變數,所以使用@Retention時必須為該value成員變數指定值。

value成員變數的值只能是如下三個:

RetentionPolicy.CLASS: 編譯器將把註釋記錄在class檔案中。當執行Java程式時,JVM不在保留註釋,這是預設值。
RetentionPolicy.RUNTIME:編譯器將把註釋記錄在class檔案中。當執行Java程式時,JVM也會保留註釋,程式可以通過反射獲取該註釋。
RetentionPolicy.SOURCE: 註解僅存在於原始碼中,在class位元組碼檔案中不包含。

使用@Target
  @Target也是用於修飾一個Annotation定義,它用於指定被修飾Annotation能用於修飾那些程式元素。@Target Annotation也包含一個名為value的成員變數,該成員變數只能是如下幾個:

ElementType.ANNOTATION_TYPE: 指定該策略的Annotation只能修飾Annotation。
ElementType.CONSTRUCTOR: 指定該策略的Annotation能修飾構造器。
ElementType.FIELD: 指定該策略的Annotation只能修飾成員變數。
ElementType.LOCAL_VARIABLE: 指定該策略的Annotation只能修飾區域性變數。
ElementType.METHOD: 指定該策略的Annotation只能修飾方法。
ElementType.PACKAGE: 指定該策略的Annotation只能修飾包定義。
ElementType.PARAMETER: 指定該策略的Annotation可以修飾引數。
ElementType.TYPE: 指定該策略的Annotation可以修飾類、介面(包括註釋型別)或列舉定義。

使用@Documented
  @Documented用於指定該元Annotation修飾的Annotation類將被javadoc工具提取成文件,如果定義Annotation類時使用了@Documented修飾,則所有使用該Annotation修飾的程式元素的API文件中將會包含該Annotation說明。
  
使用@Inherited
  @Inherited 元 Annotation指定被它修飾的Annotation將具有繼承性:如果某個類使用了A Annotation(定義該Annotation時使用了@Inherited修飾)修飾,則其子類將自動具有A註釋。
參考文件:https://www.cnblogs.com/be-forward-to-help-others/p/6846821.html