Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AspectJ JoinPoint question

Tags:

aspectj

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

like image 214
soontobeared Avatar asked Apr 19 '11 17:04

soontobeared


2 Answers

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.

like image 189
Biju Kunjummen Avatar answered Oct 15 '22 16:10

Biju Kunjummen


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);
}
like image 32
MADHAIYAN M Avatar answered Oct 15 '22 17:10

MADHAIYAN M