2011-04-19 18 views
8

Actualmente estoy usando JoinPoint para capturar los parámetros pasados ​​a los métodos de servicio en tiempo de ejecución. Aunque JoinPoint me ayuda a recuperar los valores de los parámetros, veo que no proporciona ninguna API buena para recuperar los nombres de los parámetros, tipos de parámetros, valores de parámetros individuales cuando el parámetro pasado es una matriz, etc.AspectJ pregunta de JoinPoint

Aquí hay un ejemplo :

public void doIt(String user, Attribute[] attr, Integer[] i, boolean bool, List<Attribute> list){.....} 

por el método anterior, cuando uso JoinPoint.getArgs(), i veo un valor de basura para el parámetro que es una matriz o una colección. Si el parámetro es una matriz o una colección, ¿cómo puedo verificar si son uno de ellos y cómo puedo recorrerlos para recuperar valores individuales?

¿Alguna sugerencia? Gracias

Respuesta

20

esto debería funcionar:

MethodSignature signature = (MethodSignature)joinPoint.getSignature(); 
String[] parameterNames = signature.getParameterNames(); 
Object[] parameterValues = joinPoint.getArgs(); 

Los parameterNames deben coincidir con lo que haya pasado en

Actualización 1:. Usted probablemente está compilando con símbolos de depuración desactivado - (pasando de forma explícita en javac - g: ninguno, o mediante banderas en maven/ant). Con los símbolos de depuración desactivados, los nombres no estarán disponibles y el compilador los reemplazará con args1, etc. Intente con una compilación con símbolos de depuración no explícitamente desactivados.

+0

Helo, esto no parece trabajar. Devuelve arg0 arg1 arg2 arg3 arg4 etc. – soontobeared

+0

He actualizado mi respuesta, es probable que tenga símbolos de depuración desactivados. Pruebe sin desactivar explícitamente los símbolos de depuración, los nombres de los parámetros deberían recuperarse correctamente. –

+0

@Biju ¿Tiene una idea de cómo convertir los símbolos de depuración en maven? – Modi

2

AspectJ pointcut

public pointcut pointcutName(): 
     execution(* ClassName.method(..)); 

Conseguir nombres de los parámetros del método

before():pointcutName(){ 
String[] paramNames = ((CodeSignature) thisJoinPointStaticPart 
       .getSignature()).getParameterNames(); 
for(String paramName:paramNames){ 
      System.out.println(paramName); 
     } 
} 

Obtención de valores de parámetros:

before():pointcutName(){ 
Object[] paramValues = thisJoinPoint.getArgs(); 

for (Object object:paramValues){ 
     System.out.println(object.toString); 
     } 
} 

Conseguir Método Valor de retorno:

after() returning(Object objectReturn) :pointcutName(){ 
    System.out.println(objectReturn); 
}