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