I am currently using JoinPoint to capture the parameters passed to service methods at runtime. Though JoinPoint helps me retrieve the parameter values, I see that it doesn't provide any good API to retrieve the names of the parameters, parameter types, individual parameter values when the parameter passed is an array etc.
Here's an example:
public void doIt(String user, Attribute[] attr, Integer[] i, boolean bool, List<Attribute> list){.....}
For the above method, when I use JoinPoint.getArgs(), i see a garbage value for the parameter which is an array or a collection. If the parameter is an array or a collection, how can I verify if they are one of those and how can I traverse them to retrieve individual values?
Any suggestions ? Thanks
This should work:
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
String[] parameterNames = signature.getParameterNames();
Object[] parameterValues = joinPoint.getArgs();
The parameterNames should match what you have passed in.
Update 1: You are probably compiling with debugging symbols turned off -(explicitly passing in javac -g:none, or through flags in maven/ant). With debugging symbols off, names will not be available and will replaced with args1 etc by the compiler. Try with a compilation with debug symbols not explicitly turned off.
AspectJ pointcut
public pointcut pointcutName():
execution(* ClassName.method(..));
Getting Parameter names of the method
before():pointcutName(){
String[] paramNames = ((CodeSignature) thisJoinPointStaticPart
.getSignature()).getParameterNames();
for(String paramName:paramNames){
System.out.println(paramName);
}
}
Getting Parameter Values:
before():pointcutName(){
Object[] paramValues = thisJoinPoint.getArgs();
for (Object object:paramValues){
System.out.println(object.toString);
}
}
Getting Method Return Value:
after() returning(Object objectReturn) :pointcutName(){
System.out.println(objectReturn);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With