Как передать тип аннотации в качестве параметра метода? - PullRequest
1 голос
/ 01 апреля 2019

Существует метод, который имеет дело с аннотациями, например,

public void getAnnotationValue(ProceedingJoinPoint joinPoint)
{
     MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
     Method method = methodSignature.getMethod();
     Annotation annotation = method.getParameterAnnotations()[0][0];
    RequestHeader requestParam = (RequestHeader) annotation;
    System.out.println(requestParam.value());
}

. Я хочу преобразовать его в универсальный метод, который принимает joinPoint и тип аннотации, например,

getAnnotationValue(joinPoint, RequestHeader);

, для которогоЯ пытался использовать:

public void getAnnotationValue(ProceedingJoinPoint joinPoint, Class<? extends Annotation> annotationType)
    {
         MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
         Method method = methodSignature.getMethod();
         Annotation annotation = method.getParameterAnnotations()[0][0];
        annotationType requestParam = (annotationType) annotation;
        System.out.println(requestParam.value());
    }

Но он выдает ошибку с указанием type unresolved error?Как справиться с этим и передать значение аннотации в эту функцию !!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

То, что вы хотите сделать, просто не работает таким образом.Проблема не в сигнатуре метода, а в неправильном понимании того, как использовать типы в Java.В этой строке ...

annotationType requestParam = (annotationType) annotation;

... у вас есть две ошибки:

  • Невозможно объявить переменную с annotationType requestParam, поскольку annotationType не является именем классабуквальное, но имя переменной.Это синтаксическая ошибка, и компилятор помечает ее так.
  • Вы не можете использовать (annotationType) annotation для приведения по той же причине, что и в первом случае.Java не работает таким образом, код просто недействителен.

Сказав это, позже ваш код предполагает, что у захваченного класса аннотаций есть метод value(), который может оказаться истинным длянекоторые классы аннотаций, но не будут работать в общем случае.Но предполагая, что метод существует во всех случаях, когда вы вызываете вспомогательный метод, вы можете изменить его на следующее:

public void getAnnotationValue(JoinPoint joinPoint) {
  MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
  Method method = methodSignature.getMethod();
  Annotation annotation = method.getParameterAnnotations()[0][0];
  Class<? extends Annotation> annotationType = annotation.annotationType();
  try {
    System.out.println(annotationType.getMethod("value").invoke(annotation));
  } catch (Exception e) {
    throw new SoftException(e);
  }
}

IMO, это очень уродливо и не очень хорошее программирование.Но он компилируется и запускается.Кстати, если у типа аннотации нет метода value(), вы увидите брошенный NoSuchMethodException.

Я думаю, что вы страдаете от проблемы XY здесь.Вы описываете не ту реальную проблему, которую хотите решить, а то, как, по вашему мнению, должно выглядеть решение, ослепляя себя и других, чтобы найти более эффективные способы решения проблемы.Следовательно, мой пример кода, вероятно, на самом деле не решает вашу проблему, а просто заставляет работать ваше уродливое решение.Это не то же самое, что хороший дизайн.

0 голосов
/ 01 апреля 2019

«Лучшая» вещь, которую вы могли сделать:

public void foo(Class<? extends java.lang.annotation.Annotation> annotationClass) { ...

Для аннотаций не существует определенного класса "type", но вы прибегаете к обычным объектам Class и просто выражаете, что ожидаете подклассы базового класса Annotation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...