编程语言
首页 > 编程语言> > Java类继承时的注解、spirng组合注解

Java类继承时的注解、spirng组合注解

作者:互联网

注解的可继承性: 注解上声明元注解**@Inherited**,然后在 Java类继承关系中,父类上声明的可继承注解,子类上不用声明,自动传承下来。

java类继承时候的属性和方法上的注解: 子类定义与父类相同的属性时,父类属性上的可继承注解不会传承下来;子类覆盖父类方法,父类方法上的可继承注解不会传承下来。

注解本身没有 继承实现的特性,不过自定义注解可以组合其他注解(jdk获取注解的api不能直接获取到组合注解中做为成员的 注解)。

类继承

public class annotationTest {
	@Target(value = {ElementType.TYPE})
    @Retention(value = RetentionPolicy.RUNTIME)
    @Inherited // 声明注解具有继承性
    @interface A {
        String value() default "";
    }

    @Target(value = ElementType.TYPE)
    @Retention(value = RetentionPolicy.RUNTIME)
    @Inherited // 声明注解具有继承性
    @interface B {
        String value() default "";
    }

    @Target(value = ElementType.TYPE)
    @Retention(value = RetentionPolicy.RUNTIME)
            // 未声明注解具有继承性
    @interface C {
        String value() default "";
    }

    @A("父类注解A")
    @B("父类注解B")
    @C("父类注解C")
    class SuperClass {
    }

    // 不写@A, 继承父类的时候, 父类上可继承的注解@A("父类注解A")也会传承下来
    // @B("子类注解B") // 子类也写上注解B,可以覆盖注解属性的值
    // 注解C不具有可继承性,所以从子类上获取不到注解C
    class ChildClass extends SuperClass {
    }

    public static void main(String[] args) {
        Annotation[] annotations = ChildClass.class.getAnnotations();
        Console.log(Arrays.toString(annotations));
        // 子类上面不写注解B: [@com.freeman.annotationTest$A(value=父类注解A), @com.freeman.annotationTest$B(value=父类注解B)]
        // 子类上面写注解B: [@com.freeman.annotationTest$A(value=父类注解A), @com.freeman.annotationTest$B(value=子类注解B)]
    }
}

spring中使用组合注解

public class annotationTest {
	    @Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
    @Retention(value = RetentionPolicy.RUNTIME)
    @Inherited // 跟 是否有 继承性 毫无关系
    @interface A {
        String value() default "";
    }

    @Target(value = ElementType.TYPE)
    @Retention(value = RetentionPolicy.RUNTIME)
    // @Inherited // 跟 是否有 继承性 毫无关系
    @interface B {
        String value() default "";
        String name() default "";
    }

    @A // 在C注解上声明 A 注解
    @B // 在C注解上声明 B 注解
    @Target(value = ElementType.TYPE)
    @Retention(value = RetentionPolicy.RUNTIME)
    @interface C {
        String value() default "";
        /**
         * spring提供的注解@AliasFor
         * AliasFor注解用来表示要覆盖B注解中的name()属性方法,
         * annotation属性声明的注解类必须存在于该注解的元注解上
         * attribute属性声明的值必须存在于B注解属性方法中(即B注解的name方法)
         */
        @AliasFor(annotation = B.class, attribute = "name")
        String name() default "cc";
    }


    // 使用C注解的类
    @C("CC")
    class DemoClass {
    }

    public static void main(String[] args) {
        Annotation[] annotations = DemoClass.class.getAnnotations();
        Console.log(Arrays.toString(annotations));
        Console.log("=======================================");

        // spring提供的工具类 AnnotationUtils
        A a1 = AnnotationUtils.findAnnotation(DemoClass.class, A.class);
        B b1 = AnnotationUtils.findAnnotation(DemoClass.class, B.class);
        Console.log("A注解=>{} , B注解=>{}",a1,b1);
        
        // spring提供的工具类 AnnotatedElementUtils
        A a2 = AnnotatedElementUtils.getMergedAnnotation(DemoClass.class, A.class);
        B b2 = AnnotatedElementUtils.getMergedAnnotation(DemoClass.class, B.class);
        Console.log("A注解=>{} , B注解=>{}",a2,b2);
        
        // 控制台输出:
        // [@com.freeman.annotationTest$C(name=cc, value=CC)]
        // =======================================
        // A注解=>@com.freeman.annotationTest$A(value=) , B注解=>@com.freeman.annotationTest$B(name=, value=)
        // A注解=>@com.freeman.annotationTest$A(value=) , B注解=>@com.freeman.annotationTest$B(name=cc, value=)
    }
}

标签:Java,String,spirng,annotationTest,value,注解,父类,class
来源: https://blog.csdn.net/lzxomg/article/details/100553724