[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] Newbie question about paramter exposure.
|
Just want to practise to see if I understand it correctly.
The point of interest
A.execute("ls -alh")
is reached.
That point of interest is specified in
execution(* example.A.execute(String)) && args(command);
So the parameter value being passed in (i.e. ls -alh) is bound to the
command
parameter in the pointcut p(String command). Thus the value of `command' (in
pointcut p(String command)) now can be replaced with "ls -alh" (whilst
method's executing).
And because an advice around(String command) is attached to the pointcut
p(String command), when the method execution join point occurs, it becomes
Object advice(String command): p("ls -alh"){
...
}
And then when advice is invoked
Object advice("ls -alh"): p("ls -alh"){
...
}
Am I correct to the above explanation?
I discover my problem is because after reading the book e.g. Aspectj in
Action, I still do not understand very well about the flow that goes between
joint points, pointcuts and advices. In a traditional method call, I
understand (maybe not precisely) that in the class Main, when executing `new
A().execute("ls -alh")', the value `ls -alh' will pass in to the execute()
method of the class A; therefore, in the execute() function of the class A,
the variable `command' can be replaced using the value `ls -alh' and gets
printed using System.out.println() method in execution.
But concept of aop looks like not the same way; so it makes me confused.
Please correct me if anything goes wrong.
Thanks for your help.
I really appreciate it.
Andy Clement wrote:
>
> Hi,
>
> Your description is ok:
>
>> therefore, execution of the method `new A().execute("ls -alh")' triggers
>> the around() advice, which passes in a value `ls -lah' (as the variable
>> command). That value `ls -alh' passes to
>> pointcut p(), which also takes a variable named command. And that
>> pointcut p() tries to capture the execution of a method specified as `*
>> example.A.execute(String)' and its argument
>> must be `command.'
>
> let me write it another way to see if that helps. Think about the
> events that occur when the program runs:
> Main.main() starts executing
> it calls the Main() constructor
> it calls the process() method
> Main.process() method starts executing
> it calls the A() constructor
> it calls the execute("ls -alh") method
> A.execute("ls -alh") method starts executing *
> it accesses the field System.out
> it calls the method println()
>
> all those are the joinpoints in your program flow and your pointcut is
> choosing the one you are interested in. You have used 'execution(*
> execute(String))' which has selected the one I've marked * above. In
> your pointcut you've also said you are interested in the parameter
> when the method executes, so you have used 'args' to bind it - so when
> the program runs and your point of interest is reached, the parameter
> value being passed in is bound to the command parameter in your
> pointcut. You have chosen to have around() advice attached to that
> pointcut so when the method-execution join point occurs, your around
> advice is invoked with the bound parameter value. Unlike a regular
> method call, the weaving infrastructure is looking after binding the
> pointcut/advice parameter for you.
>
> Andy
>
>
>
> 2009/10/27 Neo Anderson <javadeveloper999@xxxxxxxxxxx>:
>> Hi
>>
>> I am newbie to aspectj and have a question regarding to the usage of
>> parameters exposed in the pointcut, advice, etc. Following is the source
>> code:
>>
>> package aspectj;
>>
>> public aspect P{
>> public pointcut p(String command): execution(*
>> example.A.execute(String)) && args(command);
>>
>> Object around(String command): p(command){
>> System.out.println("around() advice : command:"+command);
>> return proceed(command);
>> }
>> }
>>
>> package example;
>>
>> public class A{
>> public void execute(String c){
>> System.out.println("[A.java][execute] command:"+c);
>> }
>> }
>>
>> package example;
>>
>> public class Main{
>>
>> public static void main(String args[]){
>> new Main().process();
>> }
>>
>> void process(){
>> new A().execute("ls -alh");
>> }
>>
>> }
>>
>> The output :
>>
>> around() advice : command:ls -alh
>> [A.java][execute] command:ls -alh
>>
>>
>> Thought I can get the code worked, I do not know how to explain the
>> parameter exposed in the pointcut (e.g. p(String command)) and advice
>> (e.g. around(String command)).
>>
>> What I understand is that
>>
>> Since the execution flow is
>>
>> new A().execute("ls -lah") [Main.java] -> public void execute(String c)
>> [A.java]
>>
>> therefore, execution of the method `new A().execute("ls -alh")' triggers
>> the around() advice, which passes in a value `ls -lah' (as the variable
>> command). That value `ls -alh' passes to pointcut p(), which also takes a
>> variable named command. And that pointcut p() tries to capture the
>> execution of a method specified as `* example.A.execute(String)' and its
>> argument must be `command.'
>>
>> Is this explanation correct?
>>
>> I found out there is something not right for me, but I am not aware the
>> part that I do not understand.
>>
>> I appreciate any advice.
>>
>> Thank you very much.
>>
>>
>> Send instant messages to your online friends
>> http://uk.messenger.yahoo.com
>> _______________________________________________
>> 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
>
>
--
View this message in context: http://www.nabble.com/Newbie-question-about-paramter-exposure.-tp26077620p26081713.html
Sent from the AspectJ - users mailing list archive at Nabble.com.