Я изучаю аннотации и дошел до того, что некоторые аннотации, кажется, имеют иерархию между собой.
Я использую аннотации для генерации кода в фоновом режиме для карточек. Существуют разные типы карточек (следовательно, разный код и аннотации), но есть определенные элементы, которые у них общие, например, имя.
@Target(value = {ElementType.TYPE})
public @interface Move extends Page{
String method1();
String method2();
}
И это будет обычная аннотация:
@Target(value = {ElementType.TYPE})
public @interface Page{
String method3();
}
В приведенном выше примере я ожидал, что Move унаследует method3, но получаю предупреждение о том, что extends недействителен с аннотациями. Я пытался, чтобы аннотация расширяла общую базовую, но это не сработало. Это вообще возможно или это просто проблема дизайна?
java
inheritance
annotations
javydreamercsw
источник
источник
Ответы:
К сожалению нет. Очевидно, это как-то связано с программами, которые читают аннотации класса, не загружая их полностью. См. Почему в Java нельзя расширять аннотации?
Однако типы наследуют аннотации своего суперкласса, если эти аннотации наследуются
@Inherited
.Кроме того, если вам не нужны эти методы для взаимодействия, вы можете просто сложить аннотации в своем классе:
Есть ли причина, по которой у вас не получится?
источник
Вы можете аннотировать свою аннотацию с помощью базовой аннотации вместо наследования. Это используется в среде Spring .
Чтобы привести пример
Затем вы можете проверить, аннотирован ли класс с
Vehicle
помощью Spring AnnotationUtils :Этот метод реализован как:
AnnotationUtils
также содержит дополнительные методы для поиска аннотаций к методам и другим аннотированным элементам. Класс Spring также достаточно силен для поиска по мостовым методам, прокси-серверам и другим угловым случаям, особенно тем, которые встречаются в Spring.источник
TYPE
илиANNOTATION_TYPE
.Помимо ответа Григория аннотации аннотации.
Вы можете проверить, например, методы, содержащие
@Qualifier
аннотацию (или аннотацию, помеченную@Qualifier
) с помощью этого цикла:В основном вы делаете, чтобы получить все аннотации, присутствующие в методе, и из этих аннотаций вы получаете их типы и проверяете эти типы, если они аннотированы с помощью @Qualifier. Ваша аннотация должна быть включена Target.Annotation_type, чтобы она работала.
источник
Посмотрите https://github.com/blindpirate/annotation-magic , библиотеку, которую я разработал, когда у меня возник тот же вопрос.
источник