java註解初步學習和使用

zg_zeus發表於2020-10-05

1 自定義註解之@Target、@Retention註解和@Documented

參考:https://blog.csdn.net/github_35180164/article/details/52118286
https://www.jianshu.com/p/ba1d384dceec

2.1 @Target註解

@Target說明了Annotation所修飾的物件範圍:Annotation可被用於 packages、types(類、介面、列舉、Annotation型別)、型別成員(方法、構造方法、成員變數、列舉值)、方法引數和本地變數(如迴圈變數、catch引數)。
看下自定義註解的簡單使用方式,定義3個執行時註解:

// 適用類、介面(包括註解型別)或列舉
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ClassInfo {
    String value();
}
// 適用field屬性,也包括enum常量
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FieldInfo {
    int[] value();
}
// 適用方法
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodInfo {
    String name() default "long";
    String data();
    int age() default 27;
}

2.2 @Retention註解

1、RetentionPolicy.SOURCE:註解只保留在原始檔,當Java檔案編譯成class檔案的時候,註解被遺棄;
2、RetentionPolicy.CLASS:註解被保留到class檔案,但jvm載入class檔案時候被遺棄,這是預設的生命週期;
3、RetentionPolicy.RUNTIME:註解不僅被儲存到class檔案中,jvm載入class檔案之後,仍然存在;

2.3 @Documented註解

這3個生命週期分別對應於:Java原始檔(.java檔案) —> .class檔案 —> 記憶體中的位元組碼。
Documented 註解表明這個註解應該被 javadoc工具記錄. 預設情況下,javadoc是不包括註解的. 但如果宣告註解時指定了 @Documented,則它會被 javadoc 之類的工具處理, 所以註解型別資訊也會被包括在生成的文件中

2 自定義註解之@AliasFor註解(用於為註解屬性宣告別名)

參考:https://www.jianshu.com/p/d6bba708100d
在同個註解中為同一個功能定義兩個名稱不一樣的屬性,那麼這兩個屬性彼此互為別名,別名的作用也就是在定義多個屬性時為了能做到顧名思義,隨意用都行。

2.1 顯式別名

@AnonymousAccess
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.DELETE)
public @interface AnonymousDeleteMapping {

    @AliasFor(annotation = RequestMapping.class)
    String name() default "";

    @AliasFor(annotation = RequestMapping.class)
    String[] value() default {};

    @AliasFor(annotation = RequestMapping.class)
    String[] path() default {};

    @AliasFor(annotation = RequestMapping.class)
    String[] params() default {};

}

這裡的四組別名用法是一致的!AnonymousDeleteMapping中的name、value、path和params是彼此的顯性別名,使用的時候可以通過任意屬性名來指定。
(注:@AliasFor的annotation屬性必須引用元註解,被引用的元註解必須放置在宣告瞭@AliasFor的註解類上,如RequestMapping;因為annotation是RequestMapping類,需要傳入的是地址;)
具體使用:

@RequestMapping(value = "/login")
@AnonymousPostMapping(value = "/login")
@AnonymousPostMapping(path = "/login")

2.2 隱式別名

如果註解中的一個或多個屬性宣告為同一個元註解屬性的屬性重寫(直接地或傳遞地重寫)那麼這些註解會被當作彼此的隱性別名集來對待

@ContextConfiguration
public @interface MyContextConfiguration{

    @AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
    String[] values() default {};
    
    @AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
    String[] path() default {};
}

@MyContextConfiguration中,valueh和path都是複寫了@ContextConfiguration中locations屬性。
具體使用:

@ContextConfiguration(locations = {})
@MyContextConfiguration(values = {})

2.3 使用規則

參考上面url即可。

相關文章