[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] suspicious super call interception

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 <kristof.jozsa@xxxxxxxxx>:
> 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
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>