一、該標簽存在的意義
顧名思義 @AliasFor 表示別名,它可以注解到自定義注解的兩個屬性上,表示這兩個互為別名,也就是說這兩個屬性其實同一個含義。該標簽存在的含義,從網上查發現有個點,
- 若 自定義注解有一個屬性,且該屬性命名上為了體現其含義,所以有些復雜,這樣調用方必須每次使用自定義注解的時候,都必須寫明 屬性 ,然后設置,這樣會比較負責;
- 同時若自定義注解繼承了另一個注解,要想讓調用方能夠設置繼承過來的屬性值,就必須在自定義注解中重新定義一個屬性,同時聲明該屬性是父注解某個屬性的別名。
二、該標簽的用法
/** * @AliasFor 用法:<br> * <li>用到注解 屬性上,表示兩個屬性互相為別名,互相為別名的屬性值必須相同,若設置成不同,則會報錯</li> * <li>注解是可以繼承的,但是注解是不能繼承父注解的屬性的,也就是說,我在類掃描的時候,拿到的注解的屬性值,依然是父注解的屬性值,而不是你定義的注解的屬性值<br> * 所以此時可以在子注解對應的屬性上加上@AliasFor<br> * <pre><code> * * </code></pre> * </li> * @author sandy * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Inherited public @interface MyAnnotation { @AliasFor(attribute = "location") String value() default ""; @AliasFor(attribute = "value") String location() default ""; }
1、同個注解中的兩個屬性互為別名
在 MyAnnitation 自定義注解類中,value屬性和location屬性互為別名,此時用的時候可以指定屬性名設置屬性值,也可以缺省屬性名:
(1) 指定屬性名設置屬性值
@MyAnnotation(location = "location") public class AliasTest extends BaseTest { @Test public void test() { MyAnnotation myAnnotation = AnnotationUtils.getAnnotation(this.getClass(), MyAnnotation.class); System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.location()); } } 輸出值為: value:location;loation:location
@MyAnnotation(value = "location") public class AliasTest extends BaseTest { @Test public void test() { MyAnnotation myAnnotation = AnnotationUtils.getAnnotation(this.getClass(), MyAnnotation.class); System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.location()); } } 輸出值為: value:location;loation:location
由上可知,無論指明設置哪個屬性名設置屬性值,另一個屬性名也是同樣屬性值。若兩個都指明屬性值,要求值必須相同,否則會報錯。
(2) 缺省屬性名設置屬性值
@MyAnnotation("location") public class AliasTest extends BaseTest { @Test public void test() { MyAnnotation myAnnotation = AnnotationUtils.getAnnotation(this.getClass(), MyAnnotation.class); System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.location()); } } 輸出值: value:location;loation:location
2、繼承父注解的屬性,使其擁有更強大的功能
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Inherited @MyAnnotation public @interface SubMyAnnotation { @AliasFor(value="location",annotation=MyAnnotation.class) String subLocation() default ""; @AliasFor(annotation=MyAnnotation.class) //缺省指明繼承的父注解的中的屬性名稱,則默認繼承父注解中同名的屬性名 String value() default ""; }
在 SubMyAnnotation 中 明顯 subLocation 和 value 是互為別名。
(1) 將 SubMyAnnotation 中 value 默認值設置為 ddd,此時,使用注解時作如下配置會報錯
@SubMyAnnotation(subLocation = "location")
public class SubAliasTest extends BaseTest { @Test public void test() { SubMyAnnotation myAnnotation = AnnotationUtils.getAnnotation(this.getClass(), SubMyAnnotation.class); System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.subLocation()); } }
(2) 不設置 SubMyAnnotation 中 value 默認值設置為 ddd,則如上的例子可以成功執行