Иметь общий базовый тип для всех моих пользовательских аннотаций - PullRequest
2 голосов
/ 20 сентября 2019

Итак, я создал несколько пользовательских аннотаций:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Foo {

}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Bar {

}

Эти аннотации используются в моих функциях:

public class Worker {

   @Foo
   public void doTaskOne() {...}

   @Bar
   public void doTaskX() {...}

   ...
}

Я хочу использовать отражение Java, чтобы проверить, является ли определенная аннотацияобъявлено в одном методе.

for (Method m : methods) {
      if (m.isAnnotationPresent(Foo.class)) {
        ...
      } else if (m.isAnnotationPresent(Bar.class)) {
        ...
      }
}

Проблема заключается в том, что в Java пользовательская аннотация @interface не может быть расширена.Я имею в виду, что это незаконно:

public @interface Bar extends MyBaseAnnotation{
}

То есть я не могу иметь базу @interface для всех моих пользовательских классов аннотаций Foo и Bar.Итак, если у меня есть новая пользовательская аннотация, мне нужно добавить еще условие else if в приведенный выше метод проверки кода, и это отстой!Есть ли способ избавиться от этой проблемы?Чего я хочу добиться, так это обобщить код проверки моего метода на:

for (Method m : methods) {
     if (m.isAnnotationPresent(MyBaseAnnotation.class)) {
         ...
     }
}

Как этого добиться?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Предполагая, что

@Parent
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Foo {}

@Parent
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Bar {}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
@interface Parent {}

и существует метод

public static boolean isAnnotationPresent(Method method, Class<? extends Annotation> parentAnnotation) throws NoSuchMethodException {
    for (Annotation methodAnnotation : method.getDeclaredAnnotations()) {
        if (methodAnnotation.annotationType().isAnnotationPresent(parentAnnotation)) {
            return true;
        }
    }
    return false;
}

, вы можете сделать

isAnnotationPresent(m, Parent.class)

Вы правильно поняли: естьнет наследования между типами аннотаций в Java.Вы могли бы сделать свои собственные правила, хотя.Говоря: «Если над аннотацией B над ней аннотация A, то B расширяет A», вы определяете правило, которому будете следовать при использовании отражения.

0 голосов
/ 20 сентября 2019

Вы можете комментировать свои пользовательские аннотации с помощью базовой пользовательской аннотации, например, составные аннотации do.

Вместо:

public @interface Bar extends MyBaseAnnotation{
}

использовать:

@MyBaseAnnotation
public @interface Bar {
}
...