Получить аннотированные параметры внутри pointcut
У меня есть две аннотации @LookAtThisMethod
и @LookAtThisParameter
, если у меня есть pointcut вокруг методов с @LookAtThisMethod
, как я могу извлечь параметры указанного метода, которые аннотируются с помощью @LookAtThisParameter
?
Например:
@Aspect
public class LookAdvisor {
@Pointcut("@annotation(lookAtThisMethod)")
public void lookAtThisMethodPointcut(LookAtThisMethod lookAtThisMethod){}
@Around("lookAtThisMethodPointcut(lookAtThisMethod)")
public void lookAtThisMethod(ProceedingJoinPoint joinPoint, LookAtThisMethod lookAtThisMethod) throws Throwable {
for(Object argument : joinPoint.getArgs()) {
//I can get the parameter values here
}
//I can get the method signature with:
joinPoint.getSignature.toString();
//How do I get which parameters are annotated with @LookAtThisParameter?
}
}
Ответы
Ответ 1
Я смоделировал свое решение вокруг этого другого ответа на другой, но похожий вопрос.
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getMethod().getName();
Class<?>[] parameterTypes = signature.getMethod().getParameterTypes();
Annotation[][] annotations = joinPoint.getTarget().getClass().getMethod(methodName,parameterTypes).getParameterAnnotations();
Причина, по которой мне пришлось пройти через целевой класс, заключалась в том, что класс, который был аннотирован, был реализацией интерфейса и, следовательно, signature.getMethod().getParameterAnnotations()
возвращал null.
Ответ 2
final String methodName = joinPoint.getSignature().getName();
final MethodSignature methodSignature = (MethodSignature) joinPoint
.getSignature();
Method method = methodSignature.getMethod();
GuiAudit annotation = null;
if (method.getDeclaringClass().isInterface()) {
method = joinPoint.getTarget().getClass()
.getDeclaredMethod(methodName, method.getParameterTypes());
annotation = method.getAnnotation(GuiAudit.class);
}
Этот код охватывает случай, когда метод принадлежит интерфейсу