Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] execution pointcut and subclassing




This is a classic example of the value of AJDT. If you load this program up
in Eclipse you will immediately see what's going on before you run it.

Matthew Webster
AOSD Project
Java Technology Centre, MP146
IBM Hursley Park, Winchester,  SO21 2JN, England
Telephone: +44 196 2816139 (external) 246139 (internal)
Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx
http://w3.hursley.ibm.com/~websterm/

"Wes Isberg" <wes@xxxxxxxxxxxxxx>@eclipse.org on 10/03/2006 19:42:01

Please respond to Wes Isberg <wes@xxxxxxxxxxxxxx>; Please respond to
       aspectj-users@xxxxxxxxxxx

Sent by:    aspectj-users-bounces@xxxxxxxxxxx


To:    aspectj-users@xxxxxxxxxxx
cc:
Subject:    Re: [aspectj-users] execution pointcut and subclassing


Hi -

This is a good question because it shows exactly what's being matched.

Further down in the programming guide is a discussion of matching
method execution join points:

   When matching method-execution join points, if the execution
   pointcut method signature specifies a declaring type, the
   pointcut will only match methods declared in that type, or
   methods that override methods declared in or inherited by
   that type

So,...

> Notice that, when square.moveBy is called, even moveBy method is not
> defined in Rectangle class, the pointcut execution(*
> Rectangle.moveBy(..)) still matches it,

Shape.moveBy(int,int) is a method inherited by Rectangle.  The join
point signature Square.moveBy(int,int) overrides that, so the
pointcut matches.

> however, when rect.moveBy is called,
> "exec:Rectangle.moveBy" doesn't show up

The method-execution join point signature is not Rectangle.moveBy(int,int)
but Shape.moveBy(int, int).  That does not "override methods
declared in or inherited by" Rectangle - Rectangle inherits that.

This is designed to capture ordinary overriding semantics:
Square is a Rectangle and a Shape, but Shape is not a Rectangle.

To pick out calls to Shape.moveBy(int, int) accessed via Rectangle,
use call(void Rectangle.moveBy(int, int)) or
call(void Shape.moveBy(int,int)).

Does that make sense?
Wes

> ------------Original Message------------
> From: "Linton Ye" <lintonye@xxxxxxxxxxxxxxx>
> To: "aspectj-users" <aspectj-users@xxxxxxxxxxx>
> Date: Fri, Mar-10-2006 10:32 AM
> Subject: [aspectj-users] execution pointcut and subclassing
>
> Hi,
>
> Recently I came across some issues regarding execution pointcut and
> subclassing, a sample code is as following:
>
> class Shape {
>   public void moveBy(int x, int y) {...}
> }
>
> class Rectangle extends Shape {
> }
>
> class Square extends Rectangle {
>   public void moveBy(int x, int y) {...}
> }
>
> class Driver {
>   public void main(String[] args) {
>     System.out.println("[ Shape square = new Square();
> square.moveBy(1,1); ]");
>     Shape square = new Square();
>     square.moveBy(1,1);
>
>     System.out.println("[ Shape rect = new Rectangle();
> rect.moveBy(1,1); ]");
>     Shape rect = new Rectangle();
>     rect.moveBy(1,1);
>   }
> }
>
> aspect SomeAspect {
>   after():execution(* Rectangle.moveBy(..)) {
>     System.out.println("exec:Rectangle.moveBy");
>   }
>   after():execution(* Square.moveBy(..)) {
>     System.out.println("exec:Square.moveBy");
>   }
>   after():execution(* Shape.moveBy(..)) {
>     System.out.println("exec:Shape.moveBy");
>   }
> }
>
> If we run the above example, we will get the following output:
>
> [ Shape square = new Square(); square.moveBy(1,1); ]
> exec:Rectangle.moveBy
> exec:Square.moveBy
> exec:Shape.moveBy
>
> [ Shape rect = new Rectangle(); rect.moveBy(1,1); ]
> exec:Shape.moveBy
>
> Notice that, when square.moveBy is called, even moveBy method is not
> defined in Rectangle class, the pointcut execution(*
> Rectangle.moveBy(..)) still matches it, however, when rect.moveBy is
called,
> "exec:Rectangle.moveBy" doesn't show up because moveBy method is not
overriden in
> Rectangle.
>
> I searched on the bugzilla and tried the same program on both AspectJ
> and ABC compiler and got the same result, so I assume it's not a bug in
> AspectJ implementation.
>
> The question is, what is the semantics of the method signature in
> execution pointcut?  I checked the semantics appendix on eclipse.org and
got
> the answer that "the signature is a method signature whose qualifying
> type is the declaring type of the method".  However, this doesn't seem
> to explain much - the result is still contradictory.
>
> Thanks,
> Linton
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users




Back to the top