1. 程式人生 > >android 註解學習筆記二: 元註解和自定義註解

android 註解學習筆記二: 元註解和自定義註解

首先看一個自定義的註解:

1、自定義註解

public @interface MyAnnotation {
      int age();
}

可見定義一個註解非常簡單,只需要使用@interface關鍵字來定義即可。 同時我們可以看到,註解的內部可以定義變數,但是在定義變數之後必須加上括號()。

使用:

public class Test {
    @MyAnnotation(age = 15) //使用自定義的註解
    public static void main(String[] args) {
    }
}

我們必須指明註解屬性age的值,如果不想指明,而想給自定義註解設定一個預設值的話,可以這樣寫: int age() default 15; 使用default可以給自己的註解屬性設定預設值。

public @interface MyAnnotation {
    int age() default 15;
}

這樣使用的時候即使不指明age的值也可以正常使用:

    @MyAnnotation//使用自定義的註解
    public static void main(String[] args) {
    }

2、Retention和RetentionPolicy

Retention 翻譯過來就是保留,滯留的意思,它也是一個註解,它可以用來表示我們的自定義註解的作用週期。

RetentionPolicy是一個列舉型別,它裡面定義了註解的三種作用週期:原始碼期,CLASS檔案時,執行時

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME;

    private RetentionPolicy() {
    }
}

SOURCE :此註解的資訊只會記錄在原始檔中,編譯時將被編譯器丟棄,即此註解資訊不回保留字編譯好的class檔案中。我們的自定義註解通常不會用到這種型別。 @Override和@SuppressWarnings就是此類註解,註解資訊只能在原始檔中出現。

CLASS:編譯器將把註解記錄在class檔案中,但不會被載入到JVM中,如果我們自定義的註解沒有宣告作用範圍,那麼將預設是CLASS註解。這種註解被稱為編譯時註解。

RUNTIME:此註解的資訊將會保留在原始檔,class檔案中,並且會在執行的時候載入到JVM中,因此這種註解可以通過反射讀取。這種註解被稱為執行時註解。 @Deprecated 就是此類註解,註解資訊在執行時出現

我們很容易可以發現,一個註解的執行週期:RUNTIME>CLASS>SOURCE 總結一下就是: 如果要做一些原始碼的檢查操作用SOURCE 如果要做一些預處理操作,比如生成程式碼就用CLASS,例如ButterKnife 如果要在執行時通過反射操作,動態的獲取註解資訊,就只能用RUNTIME

使用一下Retention:

@Retention(value = RetentionPolicy.RUNTIME)//表明我們的註解是一個執行時註解
public @interface MyAnnotation {
    int age() default 15;
}

3、元註解

如上面的程式碼,像Retention這種用來表示註解的特殊註解,就被稱為元註解。 其它的元註解還有:

@Target:表明註解作用的目標 @Document:表明註解將被包含在javadoc中 @Inherited:表明子類可以繼承父類中的此註解 @Repeatable:java se8中引入的表明註解可以重複應用在同一個目標上

@Target的使用型別:@Target(ElementType.XXXX)

public enum ElementType {
    TYPE, //介面、類、列舉、註解
    FIELD, //欄位、列舉的常量
    METHOD,//方法
    PARAMETER,//方法引數
    CONSTRUCTOR,//建構函式
    LOCAL_VARIABLE,//區域性變數
    ANNOTATION_TYPE,//註解
    PACKAGE,//包
    
    TYPE_PARAMETER,//型別,1.8以後新增
    TYPE_USE;//型別,1.8以後新增

    private ElementType() {
    }
}