zoukankan      html  css  js  c++  java
  • @AliasFor 注解

    @AliasFor 注解

    一、该标签存在的意义

    ​ 顾名思义 @AliasFor 表示别名,它可以注解到自定义注解的两个属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义。该标签存在的含义,从网上查发现有个点,

    • 若自定义注解有一个属性,且该属性命名上为了体现其含义,所以有些复杂,这样调用方必须每次使用自定义注解的时候,都必须写明 属性 ,然后设置,这样会比较负责;
    • 同时若自定义注解继承了另一个注解,要想让调用方能够设置继承过来的属性值,就必须在自定义注解中重新定义一个属性,同时声明该属性是父注解某个属性的别名。

    二、@AliasFor的用法

    /**
     * <li>用到注解 属性上,表示两个属性互相为别名,互相为别名的属性值必须相同,若设置成不同,则会报错</li>
     * <li>注解是可以继承的,但是注解的属性是不能继承父注解的属性的,也就是说在类扫描的时候,拿到的注解的属性值,依然是父注解的属性值,而不是你定义的注解的属性值<br>
     * 所以此时可以在子注解对应的属性上加上@AliasFor<br>
     */
    @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 {
        // 与父注解中的location属性互为别名,表示相同含义
        @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,则如上的例子可以成功执行

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
  • 相关阅读:
    java网络编程(UDP详解)
    java网络编程(TCP详解)
    java-单例详解
    java-接口和抽象类的联系和区别。
    java-集合小结
    Java异常(一)Java异常简介及其框架
    JAVA的接口
    深入理解Java的接口和抽象类
    linux动态库编译和使用详细剖析
    C基础 time.h 简单思路扩展
  • 原文地址:https://www.cnblogs.com/hhddd-1024/p/15172132.html
Copyright © 2011-2022 走看看