问题
I want to create a pointcut to target a call to a method from specific methods.
take the following:
class Parent {
public foo() {
//do something
}
}
class Child extends Parent {
public bar1() {
foo();
}
public bar2() {
foo();
}
public bar3() {
foo();
}
}
I would like to have a point cut on the call to foo() in methods bar1() and bar3()
I was thinking something like
pointcut fooOperation(): call(public void Parent.foo() && (execution(* Child.bar1()) || execution(* Child.bar3()) );
before() : fooOperation() {
//do something else
}
however, that doesnt seem to work. any ideas?
thanks
回答1:
Maybe withincode will work:
call(public void Parent.foo()) && (withincode(* Child.bar1()) || withincode(* Child.bar3()) );
Alternatively you could try the cflow pointcut:
pointcut bar1(): call(* Child.bar1());
pointcut bar3(): call(* Child.bar3());
call(public void Parent.foo()) && (cflow(bar1()) || cflow(bar3());
Look here for a pointcut reference
回答2:
Think what you want is instead of doing the execution clauses (which have the added disadvantage of requiring additions for each new caller), is to use target, e.g. something like:
target(Child) && call(public void Parent.foo()).
Somewhat surprisingly, I have found the pointcut guides in the eclipse documentation quite useful. They are here.
来源:https://stackoverflow.com/questions/6500399/aspectj-pointcut-to-method-call-in-specific-methods