[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[aspectj-users] execution(method) and execution(constructor)
|
Hi All
I got a question about the difference between execution
pointcut with methods and constructor, consider the following program:
public class TestSuperCalls {
public static void main(String[] args) {
Foo f = new SubFoo();
f.bar();
}
}
class Foo {
public void bar(){}
}
class SubFoo extends Foo{
public void bar(){super.bar();}
public SubFoo(){super();}
}
aspect Testing {
after(Foo f):execution(Foo.new(..))&&target(f){
System.out.println(f+" created.");
}
after(Foo f):execution(* Foo.bar(..))&&target(f){
System.out.println(f+" bar executed.");
}
}
The output of the above program is:
SubFoo@35ce36 created.
SubFoo@35ce36 bar executed.
SubFoo@35ce36 bar executed.
Notice that the first advice was executed only once, which is
what I expected, however, the second advice was executed twice.
If the line "super.bar();" is removed, the second advice will be
executed only once.
My question is, why the execution pointcut behaves differently
for methods and constructor?
I understand that when "super.bar();" is not present, the pointcut
matches because SubFoo is also a Foo, so the execution of the overriden
method SubFoo.bar() should be also considered the execution of Foo.bar().
But why after adding a super call, the pointcut matches twice?
And why this is different for constructors?
thanks,
linton