Hi,
I have a situation where I have several possibly cascading Around advices as
simplified below.
@Aspect
@Precedence(FirstAspect, *)
class FirstAspect{
@Around("execution(@SomeAnnotation * *.foo(..))")
public Object doAdvice(ProceedingJoinpoint jp) throws Throwable{
Object [] args = jp.getArgs();
for(int i=0;i<args.length : i++){
if(args[i] instanceof BadArg){
args[i] = new GoodArg();
}
}
jp.proceed(args);
}
}
@Aspect
class SecondAspect{
@Around("execution(@SomeAnnotation * *(..))")
public Object doAdvice(ProceedingJoinpoint jp) throws Throwable{
Object [] args = jp.getArgs();
// Gets the same args as returned from jp.getArgs() in
FirstAspect,
// not the modified ones.
…. do something but have BadArg instead of GoodArg…..
jp.proceed();
}
}
FirstAspect may or may not appear before SecondAspect, SecondAspect is
narrower. I traced through the aspectj source and debugger, and I saw that
both FirstAspect and SecondAspect have the same join point, whose args remain
the original args passed in the target method call. The args passed in to
proceed I see go into state for the AroundClosures and the ones modified in
FirstAspect do make it to the target method foo. FirstAspect is correctly
executing before SecondAspect.
I also see that JoinPoint.getArgs returns a copy of args rather than a
reference. And I've read a whole bunch on the web about binding args inside
the join point using args. However, this binding requires some name/pattern,
and both FirstAspect, SecondAspect match to any method params (..).
So how can I modify things such that downstream aspects of FirstAspect will get
the modified args passed by FirstAspect to JoinPoint.proceed? Is there a way
in the advice matching to bind to args(..) so I can get it as a reference in
FirstAspect? Or, can SecondAspect somehow get the AroundClosure state so it
can look at those rather than JoinPoint.getArgs()?
In the meantime, I've just setup a globally accessible
ThreadLocal<Map<JoinPoint, Object[]> variable that aspects (possibly)
downstream of FirstAspect can lookup modified args and use those if they exist
rather than the JoinPoint.getArgs(). This is pretty clunky workaround for the
moment, I feel I am really missing something here.
Any help would be appreciated.
Thanks1
Jay Roberts
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users