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() {
}
}