Как я могу получить доступ к атрибутам методов с помощью Spring AOP (AspectJ-style)? - PullRequest
9 голосов
/ 27 октября 2010

Мне нужно перехватить некоторые методы и их атрибуты, используя аннотации как точки среза, но как мне получить доступ к этим атрибутам метода. У меня есть следующий код, который может успешно выполнить код до запуска метода, но я просто не знаю, как получить доступ к этим атрибутам.

package my.package;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyAspect {

 @Pointcut(value="execution(public * *(..))")
 public void anyPublicMethod() {
 }

 @Around("anyPublicMethod() && @annotation(myAnnotation )")
 public Object myAspect(ProceedingJoinPoint pjp, MyAnnotation myAnnotation)
    throws Throwable {

  // how can I access method attributes here ?
  System.out.println("hello aspect!");
  return pjp.proceed();
 }
}

Ответы [ 2 ]

13 голосов
/ 27 октября 2010

Вы можете получить их из объекта ProceedingJoinPoint:

@Around("anyPublicMethod() && @annotation(myAnnotation )")
public Object myAspect(final ProceedingJoinPoint pjp,
    final MyAnnotation myAnnotation) throws Throwable{

    // retrieve the methods parameter types (static):
    final Signature signature = pjp.getStaticPart().getSignature();
    if(signature instanceof MethodSignature){
        final MethodSignature ms = (MethodSignature) signature;
        final Class<?>[] parameterTypes = ms.getParameterTypes();
        for(final Class<?> pt : parameterTypes){
            System.out.println("Parameter type:" + pt);
        }
    }

    // retrieve the runtime method arguments (dynamic)
    for(final Object argument : pjp.getArgs()){
        System.out.println("Parameter value:" + argument);
    }

    return pjp.proceed();
}
5 голосов
/ 27 октября 2010

ProceedingJoinPoint имеет pjp.getArgs(), который возвращает все параметры метода.

(но они называются параметрами / аргументами, а не атрибутами)

...