Получить аннотированные параметры внутри pointcut - PullRequest
22 голосов
/ 07 июля 2011

У меня есть две аннотации @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?
    }

}

Ответы [ 2 ]

40 голосов
/ 09 июля 2011

Я смоделировал свое решение вокруг этого другого ответа на другой, но похожий вопрос.

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() вернул ноль.

3 голосов
/ 04 декабря 2015
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);
    }

Этот код покрывает случай, когда метод принадлежит интерфейсу

...