2010-10-27 18 views
9

Necesito introducir algunos métodos y sus atributos mediante el uso de anotaciones como cortes de punto, pero ¿cómo puedo acceder a esos atributos de método? Tengo el siguiente código que puede ejecutar código antes de que se ejecute el método, pero no sé cómo puedo acceder a esos attrbiutes.¿Cómo puedo acceder a los atributos de los métodos con Spring AOP (estilo AspectJ)?

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(); 
} 
} 

Respuesta

13

Los puede obtener a partir del objeto 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(); 
} 
+0

Ok ahora Im conseguirlo, pero devuelve parámetros impares. org.springframework.s[email protected]8c666a org.springframework.security.web.context.Ht[email protected]197d20c. Mi método es el controlador de Spring con @RequestMapping y mi propia anotación. ¿Por qué me da algunos objetos Spring Security aquí cuando debería dar el objeto HttpServletRequest como params? – newbie

+0

Esos son proxies de primavera alrededor de los objetos de solicitud HTTP originales. Consulte mi respuesta actualizada: puede obtener los tipos de parámetros definidos (análisis estático) y los argumentos de tiempo de ejecución reales (análisis dinámico) –

+0

¿Cómo puedo obtener valores de parámetros estáticos, en este caso el objeto HttpServletRequest? – newbie

5

ProceedingJoinPoint tiene pjp.getArgs(), que devuelve todos los parámetros del método.

(pero estos son llamados parámetros/argumentos, no atributos)

Cuestiones relacionadas