java進階之自定義註解

Android機動車發表於2018-01-09

一、簡介

註解是Java 1.5引入的,可以提供程式碼的額外資訊,目前正在被廣泛應用。除了Java內建註解,我們也可以自定義註解。

以下就是一個自定義註解的簡單例子:

@Target(ElementType.TYPE) //註解作用於型別(類,介面,註解,列舉)
@Retention(RetentionPolicy.RUNTIME) //執行時保留,執行中可以處理
@Inherited // 註解將被用於該類的子類
@Documented // 生成javadoc檔案
public @interface JsAnnotation {

    String DEFAULT_VALUE = "JS";

    /**
     * 建立此value方法,則使用註解時可直接傳參,如 @JsAnnotation("msg")
     *
     * @return
     */
    String value() default DEFAULT_VALUE;

}
複製程式碼

自定義註解關鍵點:

  • @interface關鍵字定義註解
  • 註解可以被其它註解修飾,最重要的就是元註解
  • 註解和介面類似,內部可以定義常量和方法
  • 註解定義的方法有一些限制:方法不能有引數;返回值只能是基本型別、字串、Class、列舉、註解、及以上型別的陣列;可以包含預設值

二、元註解介紹

元註解就是定義註解的註解。

包含@Target、@Retention、@Inherited、@Documented這四種

1、@Target

描述註解的使用目標。

其原始碼為:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Target {
    ElementType[] value();
}
複製程式碼

註解方法返回值是ElementType[],ElementType列舉型別,列舉值就是@Target註解的可取值。

方法名value,這樣在使用註解時,可以不需要指定方法名。

可取的值有:

取值 含義
ElementType.PACKAGE 註解作用於包
ElementType.TYPE 註解作用於型別(類,介面,註解,列舉)
ElementType.ANNOTATION_TYPE 註解作用於註解
ElementType.CONSTRUCTOR 註解作用於構造方法
ElementType.METHOD 註解作用於方法
ElementType.PARAMETER 註解作用於方法引數
ElementType.FIELD 註解作用於屬性
ElementType.LOCAL_VARIABLE 註解作用於區域性變數

注意:預設可以作用於以上任何目標。

2、@Retention

描述註解的生命週期。

其原始碼為:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Retention {
    RetentionPolicy value();
}
複製程式碼

註解方法返回值是列舉型別RetentionPolicy,列舉值就是@Retention註解的可取值。

可取的值有:

取值 含義
RetentionPolicy.SOURCE 原始碼中保留,編譯期可以處理
RetentionPolicy.CLASS Class檔案中保留,Class載入時可以處理
RetentionPolicy.RUNTIME 執行時保留,執行中可以處理

預設RetentionPolicy.CLASS 值。

3、@Documented

描述註解可以文件化,是一個標記註解。

在生成javadoc的時候,是不包含註釋的,但是如果註解被@Documented修飾,則生成的文件就包含該註解。

其原始碼為:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Documented {
}
複製程式碼

4、@Inherited

標記註解,使用@Inherited修飾的註解作用於一個類,則該註解將被用於該類的子類。

其原始碼為:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Inherited {
}
複製程式碼

三、自定義註解示例

1、定義註解

@Target(ElementType.TYPE) //註解作用於型別(類,介面,註解,列舉)
@Retention(RetentionPolicy.RUNTIME) //執行時保留,執行中可以處理
@Inherited // 註解將被用於該類的子類
@Documented // 生成javadoc檔案
public @interface JsAnnotation {

    String DEFAULT_VALUE = "JS";

    /**
     * 顏色列舉
     *
     * @author peida
     */
    enum Color {
        BULE, RED, GREEN
    }

    /**
     * 建立此value方法,則使用註解時可直接傳參,如 @JsAnnotation("msg")
     *
     * @return
     */
    String value() default DEFAULT_VALUE;

    /**
     * 此方法返回為列舉型別,使用註解時,如 @JsAnnotation(color=Color.BLUE)
     *
     * @return
     */
    Color color() default Color.BULE;

    int num() default -1;
}
複製程式碼

其中:定義了三個方法,三個方法都有預設返回值。定義了Color列舉(因為註解的方法可以返回列舉型別)

這裡注意:

  • value方法:使用註解時可直接傳參,如 @JsAnnotation("msg")
  • 普通方法:使用註解時,如 @JsAnnotation(color=Color.BLUE)

2、使用註解

@JsAnnotation("jia shuai")
public class AnnotationTest {
    
}
複製程式碼

@JsAnnotation(num = 100)
public class AnnotationTest {
    
}
複製程式碼

@JsAnnotation(color = Color.BLUE)
public class AnnotationTest {
    
}
複製程式碼

3、獲取註解

public static void main(String[] args) {
    AnnotationTest test = new AnnotationTest();
    Class tClass = test.getClass();
    JsAnnotation jsAnnotation = (JsAnnotation) tClass.getAnnotation(JsAnnotation.class);

    System.out.println(jsAnnotation.value());
    System.out.println(jsAnnotation.color());
    System.out.println(jsAnnotation.num());
}
複製程式碼

更多精彩內容關注我的微信公眾號——Android機動車

java進階之自定義註解

相關文章