Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Newbie Questions: Biggest Issue

> I wasn't able to find any
> explanation of the exact syntax of the "after returning" statement and I
> thought "target()" must refer to what the method was returning. I didn't
> realize you specified that differently, as per your code. The proper syntax
> and what each parameter in that syntax means is documented somewhere, right?

I actually went to where I thought it should be in the docs and it
wasn't explained there! So it is a hole in the docs, if you have time
please raise a bugzilla so we fix it at some point.

cheers,
Andy

On 24 February 2012 16:23, Rhino <rhino1@xxxxxxxxxxxx> wrote:
> Thank you VERY much for clearing that up, Andy! NOW I can stop spinning my
> wheels and get on with learning AspectJ!
>
> Given that the code in the example I was imitating didn't have any
> corresponding source code for the Java classes, I made an educated guess on
> what it was doing and obviously guessed wrong. I wasn't able to find any
> explanation of the exact syntax of the "after returning" statement and I
> thought "target()" must refer to what the method was returning. I didn't
> realize you specified that differently, as per your code. The proper syntax
> and what each parameter in that syntax means is documented somewhere, right?
> Preferably with examples so that I can be really clear exactly what is meant
> by each part of each statement....
>
> --
> Rhino
>
>
> On 2012-02-24 18:13, Andy Clement wrote:
>>
>> Hi,
>>>
>>>    after(int num, String needle, String haystack) returning:
>>>        target(num)
>>> &&  args(needle, haystack)
>>> &&  call(* Test01.count(..)) {
>>>
>>>        System.out.println("** needle = " + needle + "; haystack = " +
>>> haystack + "; num = " + num); //$NON-NLS-1$
>>>    }
>>
>> Your problem is target(num).  The target pointcut captures the target
>> of the method invocation (so in this case the instance of Test01 on
>> which count is running).  Test01 is not an int so your target()
>> doesn't match.  If you want to capture the return value of a call, you
>> want this:
>>
>> after(String needle, String haystack) returning(int num):
>>   args(needle,haystack)&&  call(* Test01.count(..));
>>
>>
>> cheers,
>> Andy.
>>
>>
>> On 24 February 2012 14:17, Rhino<rhino1@xxxxxxxxxxxx>  wrote:
>>>
>>> Greetings!
>>>
>>> I'm just beginning with AspectJ today so I hope you can all forgive a
>>> newbie
>>>  with some questions. I'll ask them in sequential emails to keep the size
>>> of
>>> each question manageable....
>>>
>>> While the idea behind AspectJ seems worthwhile and I'm already starting
>>> to
>>> get a sense of the potential, I'm getting bogged down in beginner issues.
>>>
>>> The biggest problem I'm having is that I can't access values from one of
>>> my
>>> methods.
>>>
>>> I'm trying to imitate this example from the AspectJ Language Guide in my
>>> own
>>> code:
>>>
>>> after(FigureElement fe, int x, int y) returning:
>>> call(void FigureElement.setXY(int, int))
>>> &&  target(fe)
>>> &&  args(x, y) {
>>> System.out.println(fe + " moved to (" + x + ", " + y + ")");
>>>  }
>>>
>>> This is my play program:
>>>
>>> ============================================
>>> package test;
>>>
>>> import ca.maximal.common.utilities.CountUtils;
>>>
>>> public class Test01 {
>>>
>>>    final String CLASS_NAME = getClass().getName();
>>>
>>>    public static void main(String[] args) {
>>>
>>>        @SuppressWarnings("unused")
>>>        Test01 countStuff = new Test01();
>>>    }
>>>
>>>    public Test01() {
>>>
>>>        String needle = "a";
>>>        String haystack = "supercalifragilisticexpialadocious";
>>>        int occurrences = count(needle, haystack);
>>>        System.out.println("needle = " + needle + "; haystack = " +
>>> haystack
>>> + "; count = " + occurrences);
>>>    }
>>>
>>>    private static int count(String needle, String haystack) {
>>>
>>>        int count = CountUtils.count(needle, haystack);
>>>
>>>        return count;
>>>    }
>>> }
>>> ============================================
>>>
>>> This is my Aspect:
>>>
>>> ============================================
>>> package test;
>>>
>>>
>>> /**
>>>  * This class
>>>  *
>>>  *<p>More</p>
>>>  *
>>>  * @version 1.0
>>>  * @since Feb 24, 2012
>>>  */
>>> public aspect LogCount {
>>>
>>>    pointcut howManyNeedles() : execution(* Test01.count(..));
>>>
>>> //    pointcut count2() : call(int count(String, String));
>>>
>>>    /* First Before */
>>>    before() : howManyNeedles() {
>>>        System.out.println("About to count...."); //$NON-NLS-1$
>>>    }
>>>
>>>    /* First After */
>>>    after() returning() : howManyNeedles() {
>>>        System.out.println("...Needles counted");  //$NON-NLS-1$
>>>    }
>>>
>>>    /* Second After */
>>>    after(int num, String needle, String haystack) returning:
>>>        target(num)
>>> &&  args(needle, haystack)
>>> &&  call(* Test01.count(..)) {
>>>
>>>        System.out.println("** needle = " + needle + "; haystack = " +
>>> haystack + "; num = " + num); //$NON-NLS-1$
>>>    }
>>>
>>> }
>>> ============================================
>>>
>>> The "First Before" and "First After" pointcuts work fine. But the "Second
>>> After" resolutely refuses to work despite many different variations on
>>> the
>>> call() statement. I've tried everything I can think of but NOTHING works.
>>>
>>> I'm sure this is something very simple but I'm darned if I can figure it
>>> out. I wonder if someone on this mailing list can help me see what's
>>> wrong?
>>>
>>> --
>>> Rhino
>>> _______________________________________________
>>> 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
>>
>>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users


Back to the top