> 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 <[email protected]> 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<[email protected]> 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 >>> [email protected] >>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >> _______________________________________________ >> aspectj-users mailing list >> [email protected] >> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >> > _______________________________________________ > aspectj-users mailing list > [email protected] > https://dev.eclipse.org/mailman/listinfo/aspectj-users _______________________________________________ aspectj-users mailing list [email protected] https://dev.eclipse.org/mailman/listinfo/aspectj-users
