我目前正在使用JoinPoint捕获在运行时传递给服务方法的参数。虽然JoinPoint帮助我检索参数值,但我发现当传递的参数是数组等时,它没有提供任何好的API来检索参数,参数类型,单个参数值的名称。
以下是一个例子:
public void doIt(String user, Attribute[] attr, Integer[] i, boolean bool, List<Attribute> list){.....}
对于上面的方法,当我使用JoinPoint.getArgs()时,我看到参数的垃圾值,它是一个数组或集合。如果参数是数组或集合,我如何验证它们是否是其中之一以及如何遍历它们以检索单个值?
有什么建议吗? 感谢
答案 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);
}