Hi Andy,

I think your sample is about something else. The code I pasted has a child
class which in fact doesn't hold the method getting called, therefore
methodcall() and super.methodcall() results in an identical behaviour just
one of them gets weaved while the other doesn't.

My target was to simply create a pointcut which can intercept childclasses
of javax.xml.ws.Service calling their parent's getPort() method. See my
original code:

pointcut wsGetPortCall() :
        call(Object javax.xml.ws.Service+.getPort(..));

but this in fact behaved a bit differently as expected as it missed the
cases where other programmers typed super.getPort() and not simply getPort()
in their code (and they did not had a getPort() body overwriting the
superclass' one). This was the barebone example code which demonstrates the
exact problem I'm having:

new Service(null, null) {
    @SuppressWarnings("unused")
    public void boo() {
        super.getPort(null);    // (1)
        getPort(null);             // (2)
    }
};

I hope it makes more sense now. My question is how to accomplish my original
goal? Is it possible?

thanks,
K



On Mon, Sep 28, 2009 at 5:26 PM, Andy Clement <[email protected]>wrote:

> public class A {
>  public static void main(String []argv) {
>    B b = new B();
>    b.run();
>  }
> }
>
>
> class Base {
>  public void getPort() {
>    System.out.println("Base.getPort()");
>  }
> }
>
> class B extends Base {
>  public void run() {
>    super.getPort();
>    getPort();
>  }
>  public void getPort() {
>    System.out.println("B.getPort()");
>  }
> }
>
> javac A.java
> java A
> Base.getPort()
> B.getPort()
>
> they can do different things.  If your question is why your advice
> didn't match, it is because super calls are not join points.  And that
> is probably a hangover from the old days of source weaving I think,
> which has just never been revisited.
>
> Andy
>
>
> 2009/9/28 Kristof Jozsa <[email protected]>:
> > Sample code:
> >
> > public aspect WSPortFixerInterceptor {
> >     pointcut wsGetPortCall() :
> >         call(Object javax.xml.ws.Service+.getPort(..));
> >
> >     Object around() : wsGetPortCall() {
> >         return WsClientTool.getInstance().fixWebServicePort(proceed());
> //
> > never mind this line
> >     }
> >
> >
> >     /** private inner class to verify correct interception */
> >     @SuppressWarnings("unused")
> >     private static class TestFixer {
> >         {
> >             new Service(null, null) {
> >
> >                 @SuppressWarnings("unused")
> >                 public void boo() {
> >                     super.getPort(null);    // (1)
> >                     getPort(null);             // (2)
> >                 }
> >             };
> >         }
> >     }
> > }
> >
> > To my best knowledge, the two calls at (1) and (2) does the very same in
> > Java, but appearently (2) gets intercepted by this aspect and (1) does
> not..
> > what's the explanation for this behaviour?
> >
> > thanks,
> > K
> >
> > _______________________________________________
> > aspectj-users mailing list
> > [email protected]
> > https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >
> >
> _______________________________________________
> aspectj-users mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to