[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Advice on Constructors With Subclasses

What about this :

public aspect CheckingWithSimplestAspectJEver {

    pointcut constructor(A inst) : execution(A+.new(..)) && this(inst);

    after(A inst) : constructor(inst) {
        if (inst.getClass().equals(
        thisJoinPointStaticPart.getSourceLocation().getWithinType()))
           System.out.println("Done with " +
              inst.getClass().getSimpleName());
    }
}

It works also with classes that instantiate another subclass of A inside
their constructors, for example delegate classes :

public class Delegate extends B {

    private C another;

    public Delegate() {
        this.another = new C();
        System.out.println("Doing stuff in delegate");
    }

}

new Delegate()

I'm in A
I'm in B
I'm in A
I'm in B
I'm in C
Done with C
Doing stuff in delegate
Done with Delegate

I think we can happily close the enhancement request, and focus more on
what the AspectJ API offers :)

Simone



BiggusJimmus wrote:
> I am attempting to write some advice that will run only after the
> construction has completely finished, i.e. after the an object has been
> completely initialized.
>
> An object can be created in any of the types in an inheritance tree, and
> thus, I would like to advise all of the constructors, but only run the
> advice once, after the object has been constructed.
>
> This is probably easier to describe via an example:
>
> public class A {
>     public A() {
>         System.out.println("init A");
>     }
> }
>
> public class B extends A {
>     public B() {
>         super();
>         System.out.println("init B");
>     }
> }
>
> public class C extends B {
>     public C() {
>         super();
>         System.out.println("init C");
>     }
> }
>
> after(A item) : execution(A+.new()) && target(item) {
>     System.out.println(thisJoinPoint.getSourceLocation());
> }
>
> public static void main(String[] args) {
>     C c = new C();
>     B b = new B();
> }
>
> The above code has the following output:
> init A
> A.java:3
> init B
> B.java:3
> init C
> C.java:3
>
> init A
> A.java:3
> init B
> B.java:3
>
> What I am attempting to create is advice that will produce the following:
> init A
> init B
> init C
> C.java:3
>
> init A
> init B
> B.java:3
>
> i.e. Only run the advice after the object is completely created
>
> I have tried a few approaches, including !within(A+.new()) and
> !cflow(execution(A+.new()), but due to the way the compiler inlines the
> super() calls, these approaches produce the same results as above.
>
> Does anybody have any experience with this problem, and/or suggestions on
> how to solve it?
>   


-- 
Simone Gianni
http://www.simonegianni.it/
CEO Semeru s.r.l.
Apache Committer