Есть ли что-то вроде annotations Inheritance в java?
Я изучаю annotations и дошел до точки, где некоторые annotations, похоже, имеют иерархию среди них.
Я использую annotations для генерации кода в фоновом режиме для Карт. Существуют разные типы карт (например, разные коды и annotations), но есть некоторые элементы, которые являются общими среди них, как имя.
@Target(value = {ElementType.TYPE}) public @interface Move extends Page{ String method1(); String method2(); }
И это будет общая аннотация:
- Могу ли я переопределить производные типы?
- Абстрактные classы в языке Swift
- Расширяет JFrame и создает его внутри программы
- Наследование с нескольких интерфейсов с тем же именем метода
- Наследование в Java - создание объекта подclassа вызывает также конструктор суперclassа. Почему именно?
@Target(value = {ElementType.TYPE}) public @interface Page{ String method3(); }
В приведенном выше примере я ожидал бы Move для наследования метода3, но я получаю предупреждение о том, что extends недействителен с аннотациями. Я пытался, чтобы аннотация распространяла общую базовую, но это не работает. Возможно ли это или просто проблема дизайна?
- шаблоны: переменные-члены родительского classа не видны в унаследованном classе
- Наследование конструкторов
- Наследование с помощью конструктора базового classа с параметрами
- MVC публикует список сложных объектов
- Вызов метода супер супер classа
- Поведение статических блоков с наследованием
- Почему мне приходится обращаться к членам базового classа шаблонов через этот указатель?
- В каком порядке выполняются статические блоки и блоки инициализации при использовании наследования?
К сожалению нет. По-видимому, это имеет какое-то отношение к программам, которые читают 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 включен также, чтобы заставить это работать.