Hi Andy, Thank you for the quick response, and the clear explanation of the pointcut. I see where I went wrong in using @annotation instead of @within to pick out the methods in the type. I like the way you've split it in two, makes it easier to understand.
Thanks! Steve On Sat, Aug 15, 2009 at 2:13 AM, Andy Clement <[email protected]>wrote: > Hi Steve, > > Let's take the pointcut apart: > > pointcut test1(Object target, ApplyMethodTiming applyMethodTiming) : > execution(@ApplyMethodTiming * *(..)) // execution of any method > that has the @ApplyMethodTiming annotation > && @annotation(applyMethodTiming) // where the subject of the join > point has @ApplyMethodTiming (subject of method execution is the method) > && target(target); // and the target is not null (ie. non-static > methods) > > Effectively the 'execution' is already limiting you to annotated methods > only - so there isn't a part that is specifying an annotated type. > > What you'd like to write is this: > > // pointcut test1(Object target, ApplyMethodTiming applyMethodTiming) : > // ((execution(@ApplyMethodTiming * *(..)) && > @annotation(applyMethodTiming)) || // annotated methods > // (@within(applyMethodTiming) && execution(* *(..)) )) // methods > in an annotated type > // && target(target); > > but that won't work because of an AspectJ bug that I never seem to find > time to fix... instead (and perhaps it is easier to understand), it can be > broken into two: > > pointcut annotatedMethods(Object target, ApplyMethodTiming > applyMethodTiming) : > execution(* *(..)) && @annotation(applyMethodTiming) && > target(target); > > pointcut methodsInAnAnnotatedType(Object target, ApplyMethodTiming > applyMethodTiming) : > execution(* *(..)) && @within(applyMethodTiming) && target(target); > > > attach some small bit of advice to each that forwards to your timing code. > > Andy > > > 2009/8/14 Stephen Houston <[email protected]> > >> Hi All, >> >> I've been having some difficulty defining a pointcut that matches all the >> methods in an annotated type. For example, my understanding of >> >> pointcut test1(Object target, ApplyMethodTiming applyMethodTiming) : >> execution(@ApplyMethodTiming * *(..)) >> && @annotation(applyMethodTiming) >> && target(target); >> >> is that it should match all methods that are annotated by >> @ApplyMethodTiming or are members of a type annotated by @ApplyMethodTiming, >> but this doesn't appear to be the case. Only those methods annotated with >> @ApplyMethodTiming are picked out. >> >> I've attached an archive of a maven project containing a few simple tests >> for this. The only one that works for me is the one that uses reflection to >> test if the class has the annotation applied to it. I'd rather not do this >> as it will be quite slow. >> >> The output of the test project is: >> >> 00:21:10,377 FATAL [ main] DOC >> methodTimingTest.ApplyMethodTimingAspect - A - Applied to execution(void >> test.methodTimingTest.ApplyMethodTimingAspectTest.takesNoTime()) >> 00:21:10,382 FATAL [ main] DOC >> methodTimingTest.ApplyMethodTimingAspect - A - Applied to execution(void >> test.methodTimingTest.TimedObject.takesNoTime()) >> 00:21:10,385 FATAL [ main] DOC >> methodTimingTest.ApplyMethodTimingAspect - R - Applied to execution(void >> test.methodTimingTest.TimedObject.takesNoTime()) >> 00:21:10,385 FATAL [ main] DOC methodTimingTest.TimedObject - >> takesNoTime >> 00:21:10,391 FATAL [ main] DOC >> methodTimingTest.ApplyMethodTimingAspect - A - Applied to execution(void >> test.methodTimingTest.ApplyMethodTimingAspectTest.worksIfAnnotated()) >> 00:21:10,394 FATAL [ main] DOC >> methodTimingTest.ApplyMethodTimingAspect - 1 - Applied to execution(void >> test.methodTimingTest.TimedObject.worksIfAnnotated()) >> 00:21:10,394 FATAL [ main] DOC >> methodTimingTest.ApplyMethodTimingAspect - 2 - Applied to execution(void >> test.methodTimingTest.TimedObject.worksIfAnnotated()) >> 00:21:10,394 FATAL [ main] DOC >> methodTimingTest.ApplyMethodTimingAspect - 3 - Applied to execution(void >> test.methodTimingTest.TimedObject.worksIfAnnotated()) >> 00:21:10,395 FATAL [ main] DOC >> methodTimingTest.ApplyMethodTimingAspect - A - Applied to execution(void >> test.methodTimingTest.TimedObject.worksIfAnnotated()) >> 00:21:10,395 FATAL [ main] DOC >> methodTimingTest.ApplyMethodTimingAspect - R - Applied to execution(void >> test.methodTimingTest.TimedObject.worksIfAnnotated()) >> 00:21:10,395 FATAL [ main] DOC methodTimingTest.TimedObject - >> annotated >> >> Where >> - A - indicates a match on all methods (execution * *(..)) >> - R - indicates a match on all methods, then use reflection to determine >> if the class has the @ApplyMethodTiming aspect >> - 1 - indicates a match on execution(@ApplyMethodTiming * *(..)) && >> @annotation(applyMethodTiming) >> - 2 - indicates a match on execution(@ApplyMethodTiming * *(..)) >> - 3 - indicates a match on execution(* *(..)) && >> @annotation(applyMethodTiming) >> >> I'm using Apsectj 1.6.5. The strange thing is that I'm sure I seen this >> working earlier today, but it doesn't appear to want to work now. >> >> Thanks >> >> Steve >> >> _______________________________________________ >> 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
