Добрый день.
Если используем аннотации, к примеру, для класса.
У нас есть некий абстрактный класс А. У него есть предок, класс B.
И там и там есть аннотация @MyAnnotation. В аннотации есть поле
String[] value() default {};
В итоге получили примерно такое:
@MyAnnotation({"str1","str2"})
abstract class A {}
@MyAnnotation({"str3","str4"})
class B extends A {}
Вопрос: Будут ли суммироваться все значения из класса и суперкласса, или просто возьмется значение из текущего объекта B. Либо, может, еще какие хитрости есть в аннотациях?
Ответ
Наследование аннотаций возможно при использовании аннотации @Inherited. В вашем случае произойдет просто перекрытие.
Аннотации
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InheritedAnnotation {
String name();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface UninheritedAnnotation {
String name();
}
Тестовые классы
@InheritedAnnotation(name = "A1")
public class A1 {}
@InheritedAnnotation(name = "B1")
public class B1 extends A1 {}
public class C1 extends A1 {}
@UninheritedAnnotation(name = "A2")
public class A2 {}
@UninheritedAnnotation(name = "B2")
public class B2 extends A2 {}
public class C2 extends A2 {}
Тест
@Test
public void test() throws Exception {
System.out.println(new A1().getClass().getAnnotation(InheritedAnnotation.class));
System.out.println(new B1().getClass().getAnnotation(InheritedAnnotation.class));
System.out.println(new C1().getClass().getAnnotation(InheritedAnnotation.class));
System.out.println(new A2().getClass().getAnnotation(UninheritedAnnotation.class));
System.out.println(new B2().getClass().getAnnotation(UninheritedAnnotation.class));
System.out.println(new C2().getClass().getAnnotation(UninheritedAnnotation.class));
}
Вывод
//@org.example.InheritedAnnotation(name=A1)
//@org.example.InheritedAnnotation(name=B1)
//@org.example.InheritedAnnotation(name=A1)
//@org.example.UninheritedAnnotation(name=A2)
//@org.example.UninheritedAnnotation(name=B2)
//null
Комментариев нет:
Отправить комментарий