Есть ли что-то вроде annotations Inheritance в java?

Я изучаю annotations и дошел до точки, где некоторые annotations, похоже, имеют иерархию среди них.

Я использую annotations для генерации кода в фоновом режиме для Карт. Существуют разные типы карт (например, разные коды и annotations), но есть некоторые элементы, которые являются общими среди них, как имя.

@Target(value = {ElementType.TYPE}) public @interface Move extends Page{ String method1(); String method2(); } 

И это будет общая аннотация:

 @Target(value = {ElementType.TYPE}) public @interface Page{ String method3(); } 

В приведенном выше примере я ожидал бы Move для наследования метода3, но я получаю предупреждение о том, что extends недействителен с аннотациями. Я пытался, чтобы аннотация распространяла общую базовую, но это не работает. Возможно ли это или просто проблема дизайна?

К сожалению нет. По-видимому, это имеет какое-то отношение к программам, которые читают annotations в classе, не загружая их полностью. См. Почему невозможно расширять annotations в Java?

Однако типы наследуют annotations своего суперclassа, если эти annotations @Inherited .

Кроме того, если вам не нужны эти методы для взаимодействия, вы можете просто складывать annotations в своем classе:

 @Move @Page public class myAwesomeClass {} 

Есть ли какая-то причина, которая не сработает для вас?

Вы можете аннотировать аннотацию базовым аннотацией вместо наследования. Это используется в Spring framework .

Чтобы привести пример

 @Target(value = {ElementType.ANNOTATION_TYPE}) public @interface Vehicle { } @Target(value = {ElementType.TYPE}) @Vehicle public @interface Car { } @Car class Foo { } 

Затем вы можете проверить, был ли class аннотирован с помощью Vehicle с помощью Spring AnnotationUtils :

 Vehicle vehicleAnnotation = AnnotationUtils.findAnnotation (Foo.class, Vehicle.class); boolean isAnnotated = vehicleAnnotation != null; 

Этот метод реализуется как:

 public static  A findAnnotation(Class clazz, Class annotationType) { return findAnnotation(clazz, annotationType, new HashSet()); } @SuppressWarnings("unchecked") private static  A findAnnotation(Class clazz, Class annotationType, Set visited) { try { Annotation[] anns = clazz.getDeclaredAnnotations(); for (Annotation ann : anns) { if (ann.annotationType() == annotationType) { return (A) ann; } } for (Annotation ann : anns) { if (!isInJavaLangAnnotationPackage(ann) && visited.add(ann)) { A annotation = findAnnotation(ann.annotationType(), annotationType, visited); if (annotation != null) { return annotation; } } } } catch (Exception ex) { handleIntrospectionFailure(clazz, ex); return null; } for (Class ifc : clazz.getInterfaces()) { A annotation = findAnnotation(ifc, annotationType, visited); if (annotation != null) { return annotation; } } Class superclass = clazz.getSuperclass(); if (superclass == null || Object.class == superclass) { return null; } return findAnnotation(superclass, annotationType, visited); } 

AnnotationUtils также содержит дополнительные методы для поиска аннотаций по методам и другим аннотированным элементам. Класс Spring также достаточно силен для поиска по мостиковым методам, прокси и другим угловым шкафам, особенно тем, которые встречаются весной.

В дополнение к Grygoriys ответ annotations аннотаций.

Вы можете проверить, например, методы для включения annotations @Qualifier (или annotations, аннотированной с помощью @Qualifier) ​​с помощью этого цикла:

 for (Annotation a : method.getAnnotations()) { if (a.annotationType().isAnnotationPresent(Qualifier.class)) { System.out.println("found @Qualifier annotation");//found annotation having Qualifier annotation itself } } 

То, что вы в основном делаете, состоит в том, чтобы получить все annotations, присутствующие в методе, и тех аннотаций, которые вы получаете, и проверить эти типы, если они аннотируются с помощью @Qualifier. Ваша аннотация должна быть Target.Annotation_type включен также, чтобы заставить это работать.

  • Инициализировать защищенные члены родителя с помощью списка инициализации (C ++)
  • Оператор «instanceof» ведет себя по-разному для интерфейсов и classов
  • Java Inheritance - вызов метода суперclassа
  • Сериализация XML и унаследованные типы
  • Почему C ++ не позволяет базовым classам реализовывать унаследованный интерфейс производного classа?
  • Синхронизировано ли унаследовано в Java?
  • Наследование из списка
  • В чем основное отличие между наследованием и polymorphismом?
  • Как интерфейсы заменяют необходимость множественного наследования при наличии существующих classов
  • Каковы правила для вызова конструктора суперclassа?
  • Как я должен объяснить разницу между интерфейсом и абстрактным classом?
  • Давайте будем гением компьютера.