Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #12347

Re: Basic AspectJ Question

From Arved Sandstrom <asandstrom3minus1@eastlink.ca>
Newsgroups comp.lang.java.programmer
Subject Re: Basic AspectJ Question
References <XnsA0049AF13CD2Djpnasty@94.75.214.39>
Message-ID <gfg2r.15444$kv1.3503@newsfe03.iad> (permalink)
Organization Public Usenet Newsgroup Access
Date 2012-02-25 21:52 -0400

Show all headers | View raw


On 12-02-25 04:07 PM, Novice wrote:
> I'm finding AspectJ very hard to get into, mostly because the manual 
> (AspectJ Language Guide) seems very weak to me. 
> 
> For example, a construct they use all the time in examples is "target()". 
> Clearly, this is an important thing. But I'm darned if I can find 
> anything in the manual that actually says what "target()" is or does! 
> They just seem to assume that it's obvious. But I've got a pretty good 
> imagination and I can imagine lots of things it might be, each of which 
> has different implications and significance....
> 
> Can anyone enlighten me on what "target()" does? Even just an indication 
> of where it is explained in the manual would be fine. A link to a better 
> manual or tutorial on AspectJ, if there is such a thing, would also be 
> greatly appreciated. 

I assume you meant the Programming Guide. If you're looking at that in
examples, it should be Right-In-Your-Face (TM) evident that target() is
a pointcut. After that you refer to Appendix B Language Semantics, and
find target(). The section on State-based Pointcuts explains this(0 and
target() pointcuts quite well.

You should get from that explanation that if you wanted your pointcut to
apply when execution is about to transfer to a Java object of type
org.novice.MyClass, say, that target(org.novice.MyClass) would be
useful. This particular primitive pointcut is particularly useful when
combined with others.

> And if anyone is aware of a manual or tutorial that explains how to do X 
> in Aspect J where there is a long list of X's, that would be REALLY 
> helpful. For instance, I'd like to write an "entering" log entry for each 
> method (and constructor) as I execute it and I want that log entry to 
> include the name of the class and method so I need a pointcut and advice 
> that is able to determine the class name and method name that is being 
> executed so that I can put it in the logging statement. I'm picturing 
> something like:
> 
> pointcut entering() : execution ( * * (..));
> 
> before() : entering() {
>     	this.logger.entering(className, methodName); 
>       }
> 
> I know that some context information is available in each method but I'm 
> not sure how to get the class and method names so that I can put them in 
> the advice.

Pointcut parameters. Each join point has 3 items of state: current
object, target object, and arguments. What you do with pointcut
parameters is to "publish" context from the selected join points. In
your example you have

pointcut entering() : ...

so because of the empty parentheses you are publishing nothing.

This is where the pointcut primitives this(), target() and args() also
come in real handy, if you use them with Java identifiers rather than types.

In your example you'd like the advice to be

before(String className, String methodname) :
entering(className, methodName) {
    log(className, methodName);
}

and you can do that by writing the pointcut as

pointcut entering(String className, String methodName) : execution( * *
(..)) && args(className, methodName);

This will work OK with the '..' wildcard for the parameters, but you'll
want to be sure that the method join points that get picked actually do
have those 2 arguments.

As a complete aside, using the this(), target() and args() pointcuts
like this sort of reminds me of Prolog unification. :-)

> That's why I'd love to find a "How to do X" list with lots of different 
> X's in it. With a bit of luck, what I'm trying to do would be on the list 
> and I get to what I want to do a little more quickly than churning 
> through the Language Guide...
> 
Getting Started With in the Programming Guide should help, as should the
FAQ. I think you're getting a bit ahead of yourself, maybe trying to get
too much coded up with aspects before doing some solid, necessary
reading and experimenting. Seriously though, the existing AspectJ docs
are simply loaded with good examples.

AHS
-- 
-- Gaiety is the most outstanding feature of the Soviet Union.
Josef Stalin, November 1935

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Basic AspectJ Question Novice <novice@example..com> - 2012-02-25 20:07 +0000
  Re: Basic AspectJ Question Arne Vajhøj <arne@vajhoej.dk> - 2012-02-25 18:04 -0500
    Re: Basic AspectJ Question Novice <novice@example..com> - 2012-02-26 01:43 +0000
  Re: Basic AspectJ Question Arved Sandstrom <asandstrom3minus1@eastlink.ca> - 2012-02-25 21:52 -0400
    Re: Basic AspectJ Question Novice <novice@example..com> - 2012-02-26 14:34 +0000

csiph-web