То, что вы хотите сделать, просто не работает таким образом.Проблема не в сигнатуре метода, а в неправильном понимании того, как использовать типы в 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 здесь.Вы описываете не ту реальную проблему, которую хотите решить, а то, как, по вашему мнению, должно выглядеть решение, ослепляя себя и других, чтобы найти более эффективные способы решения проблемы.Следовательно, мой пример кода, вероятно, на самом деле не решает вашу проблему, а просто заставляет работать ваше уродливое решение.Это не то же самое, что хороший дизайн.