I would take a look at the developers notebook we wrote for AspectJ 5: 
https://eclipse.org/aspectj/doc/next/adk15notebook/ 
<https://eclipse.org/aspectj/doc/next/adk15notebook/>

That has a good front section on join points/pointcuts.

As discussed there, there are three kind of pointcut designator: kinded, 
scoping and context:

        • Kinded designators are those which select a particular kind of join 
point. For example: execution, get, set, call, handler
        • Scoping designators are those which select a group of join points of 
interest (of probably many kinds). For example: within, withincode
        • Contextual designators are those that match (and optionally bind) 
based on context. For example: this, target, @annotation

A well written pointcut should try and include at least the first two types 
(minded and scoping), whilst the contextual designators may be included if 
wishing to match based on join point context, or bind the context for use in 
the advice. Supplying either just a kinder or just a contextual designator will 
work but could affect weaving performance (time/memory used) due to all the 
extra processing and analysis. Scoping designators are very fast to match so it 
can be very useful to include one if you can.

> 
> pointcut services(Server s): target(s) && call(public * *(..))


call to public methods where the target of the call is a Server, could also be 
written:

pointcut services(): target(Server) && call(public * *(..))

but in this latter case I’m not binding the Server instance so I can’t use it 
in my advice.

At the point the call is made in the byte code, we can see (on the stack) the 
target instance for the method call, and so we can check if it is a Server.

> 
> The question basically boils down to: do you read/define pointcuts
> outside-in/left to right and execute them inside-out/right to left?

Write them however you feel makes the most sense to you, AspectJ will rewrite 
them *anyway* into a more optimal form so that matching/weaving is as fast as 
possible. It doesn’t expect you to know the optimal order.

I would always write it this way round:

pointcut services(Server s): call(public * *(..)) && target(s);

But that says exactly the same thing. Don’t think that the ordering you specify 
in the pointcut components is relevant. At all the candidate join points we 
check everything in the pointcut.

If I were further adding scoping, I might do:

pointcut services(Server s): call(public * *(..)) && target(s) && 
within(SomePackage);

AspectJ is going to rewrite that at match time so the within check is done 
first (it is the fastest check).

> 
> Based on that, how do you build them up? (I have illustrated that bit
> of the question on StackOverflow with examples, to illustrate where my
> confusion comes from.)


As above, choose a kind:

pointcut mypointcut(): get(int *); // get of int fields

Add some context if you want:

pointcut mypointcut(MyType t): get(int *) && target(t);

Add some scoping:

pointcut mypointcut(MyType t): get(int *) && target(t) && within(com.foo.Bar);

Add more conditions if you like, you aren’t limited to one of each. They just 
have to *all* be satisfied at any joinpoint in order for it to match.

That return you picked up on looks like a copy-paste oversight, there is no 
need for the return because there is no code after the if clause that would get 
run if it didn’t return.

cheers,
Andy

> On Mar 11, 2015, at 4:30 AM, Christian Balzer 
> <christian.for.ecli...@gmail.com> wrote:
> 
> Hi all,
> 
> I'm trying to learn AspectJ at the moment, am going through the
> documentation and have two questions, which I posted on StackOverflow
> initially. I'd appreciate if someone could help me.
> 
> How do I read pointcuts? ===
> http://stackoverflow.com/q/28969333/2018047
> 
> This is basically about the example from
> https://eclipse.org/aspectj/doc/released/progguide/language-anatomy.html
> 
> pointcut services(Server s): target(s) && call(public * *(..))
> 
> "This pointcut, named services, picks out those points in the
> execution of the program when Server objects have their public methods
> called. It also allows anyone using the services pointcut to access
> the Server object whose method is being called."
> 
> I'm a bit confused how to read (and build up) pointcuts: the parameter
> list specifies a parameter s of type Server, yet the "source" for s
> seems to be the primitive pointcut target(s) - which hasn't executed
> yet, has it?
> 
> The question basically boils down to: do you read/define pointcuts
> outside-in/left to right and execute them inside-out/right to left?
> 
> Based on that, how do you build them up? (I have illustrated that bit
> of the question on StackOverflow with examples, to illustrate where my
> confusion comes from.)
> 
> 
> What does a return statement do in an AspectJ advice? ===
> http://stackoverflow.com/q/28984838/2018047
> 
> I don't quite understand why the following line from a before advice
> requires a return statement - or what it does to begin with:
> 
> System.out.println("Illegal value for x"); return;
> 
> Will it basically "return form setX()" (the "intercepted" method)
> before the method body is executed?
> 
> The full example is here:
> https://eclipse.org/aspectj/doc/released/progguide/language-interType.html#example-pointassertions
> 
> Kind regards,
> 
> Christian
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@eclipse.org
> To change your delivery options, retrieve your password, or unsubscribe from 
> this list, visit
> https://dev.eclipse.org/mailman/listinfo/aspectj-users

_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to