我有一个注释@AppManaged,它用于表示需要编织某些行为的类。编织的一个行为是将方法调用转换为并发GPars(一个常规并行库)调用。
但是我不希望建议在同一个类上进行嵌套方法调用。 所以...
@AppManaged
class someclass
{
public void method1(){
method2(); **// should not be advised**
}
public void method2(){
}
}
但是如果方法调用是从AppManaged类到另一个,那么它应该被建议,因此像!cflowbelow(@within(AppManaged))这样的东西没有帮助。
@AppManaged
class Someotherclass
{
private someclass s;
public void method3(){
s.method2();**// Should be advised.**
}
}
基本上我正在寻找一个切入点,它只匹配同一对象实例中的嵌套调用,并防止它们被建议。
任何帮助都将受到高度赞赏。
谢谢和问候 Abraham Menacherry。
答案 0 :(得分:4)
怎么样:
pointcut appManagedExecution(Object appManaged) : execution(* (@AppManaged *).*(..)) && this(appManaged);
pointcut appManagedCall(Object called) : call(* (@AppManaged *).*(..)) && target(called);
pointcut routed(Object appManaged, Object called) : appManagedCall(called) && cflowbelow(appManagedExecution(appManaged)) && if(called != appManaged);