Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Переопределяются ли аннотации в предках классов?

#java #аннотации


Добрый день.

Если используем аннотации, к примеру, для класса.
У нас есть некий абстрактный класс А. У него есть предок, класс B. 
И там и там есть аннотация @MyAnnotation. В аннотации есть поле

String[] value() default {};


В итоге получили примерно такое:

@MyAnnotation({"str1","str2"})
abstract class A {}

@MyAnnotation({"str3","str4"})
class B extends A {}


Вопрос: Будут ли суммироваться все значения из класса и суперкласса, или просто возьмется
значение из текущего объекта B. Либо, может, еще какие хитрости есть в аннотациях?
    


Ответы

Ответ 1



Наследование аннотаций возможно при использовании аннотации @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

Комментариев нет:

Отправить комментарий