AspectJ JoinPoint问题

时间:2011-04-19 17:50:00

标签: aspectj

我目前正在使用JoinPoint捕获在运行时传递给服务方法的参数。虽然JoinPoint帮助我检索参数值,但我发现当传递的参数是数组等时,它没有提供任何好的API来检索参数,参数类型,单个参数值的名称。

以下是一个例子:

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

对于上面的方法,当我使用JoinPoint.getArgs()时,我看到参数的垃圾值,它是一个数组或集合。如果参数是数组或集合,我如何验证它们是否是其中之一以及如何遍历它们以检索单个值?

有什么建议吗? 感谢

2 个答案:

答案 0 :(得分:21)

这应该有效:

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

parameterNames应与您传入的内容相匹配。

更新1:您可能正在编译关闭调试符号 - (显式传入javac -g:none,或通过maven / ant中的标志)。关闭调试符号后,名称将不可用,编译器将替换为args1等。尝试使用未明确关闭的调试符号进行编译。

答案 1 :(得分:2)

AspectJ切入点

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

获取方法的参数名称

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

获取参数值

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

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

获取方法返回值:

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