AspectJ pointcut to method call in specific method

2019-04-28 02:11发布

问题:

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.



标签: java aspectj