Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] what for args pointcut designator?

Thanks for the answer. It cleared things out for me. I didn't see it before, but indeed, it is a consistent and elegant design. I think I am for args now.

Kamil

Gregor Kiczales wrote:
There was a period of time when AspectJ didn't have args. Instead, as you
suggest, the syntax was like:

             before(int x): execution(void C.foo(x))              {...}
instead of
             before(int x): execution(void C.foo(int)) && args(x) {...}
The change was made for a variety of reasons (note that memory is not
guaranteed to be perfect here):

 - one is that its difficult to get both 'this' and 'target' to fit into
   the positional syntax.  Target is easy, you can put it in the target
   class position (i.e. 'C'). But then where does this go? Except that
   maybe the 'C' position should actually be this for execution and
   target for call? There was room for confusion there.

 - a second was the subtly different semantics of matching between
   this, target, args and execution. We felt that providing both
   semantics was useful, and so introduced two forms for them

 - a third was a desire to delineate the pointcuts that the programmer
   can be sure are tested statically from those that might require a
   dynamic test. One benefit of that is that it makes the rule for
   using the special declarative error and warning advice simple, the
   expanded pointcut cannot use this, target, args, cflow or cflowbelow.



-----Original Message-----
From: aspectj-users-bounces@xxxxxxxxxxx [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Kamil Dworakowski
Sent: Sunday, September 03, 2006 2:42 AM
To: wes@xxxxxxxxxxxxxx; aspectj-users@xxxxxxxxxxx
Subject: Re: [aspectj-users] what for args pointcut designator?

When I read your response I have an impression that you have not read the message. You respond to the question in the topic. Why would I write the body if not for you to read it? The body clarifies the meaning of the question in the topic.

In the message I asked for the most important reason for having args in the language. I mentioned that I don't view the type bounding as an important reason. I expect something more.

Luntain

Wes wrote:
this(), args(), and target() allow you to bind variables in
a type-safe way and to do runtime tests.
E.g., for
    void put(Object key, Object value)

you might want to pick out only join points with keys of type foo:

    execution(void put(Object, Object)) && args(Foo, Object)

If you were to do something with it (e.g., put Foo in a
wrapper with a better hashcode), then you'd want to bind the variable. Without binding (i.e., using reflection) you only get Object, which makes for a lot of runtime ClassCastException.
Wes

What is the most important reason for having args pointcut
designator
in aspectj language? I would prefer exposing args in
signature like this
aPointcut(int i): execution( * *.method( int i ) );

The one thing that comes to my mind is

execution( * *.meth( Object) ) && args( String )

That is, however, not an everyday use and can be achieved by type checking in the advice body.

The reason I go through it is because I want to implement
aspectj like
aop. I mean a reasonable subset. I wonder if I could just
forget about
args.

Luntain





Back to the top