T
he syntax you were initially trying to use is valid:

execution( (@Foo *) *(..)) { }

So from that point of view the docs are correct, in a method pattern the
return value can be an annotation pattern.  This example means a method
whose return type is annotated with Foo, so it would match the method here:

@Foo
class SomeType {}

public SomeType giveMeOne() {}


And just to mention this whilst on the topic, if you were on Java8 you
could write

@Target(ElementType.TYPE_USE)
@interface Foo {}

class SomeType {}

public @Foo SomeType giveMeOne() {}

And the @Foo will actually be applying to the 'SomeType' type reference,
not to the method.  I haven't decided how to fit type_use type annotations
into the AspectJ matching yet.

Andy




On 6 May 2013 11:43, Jay Roberts <puda...@gmail.com> wrote:

> Thanks for the responses - I didn't dig into it deep enough to realize
> that Java isn't supporting annotations on return types (I'm assuming that
> this is the issue….).
>
> Just to be clear, and we are Java 7, there is no way to write/annotate a
> Java method annotating the return type and that even if there were, Aspectj
> doesn't support this.
>
> I would say that perhaps the MethodPattern spec in the documentation is a
> little ambiguous, then, as it has TypePattern (for return value of method)
> and one of the patterns for this is AnnotationPattern.
>
> Maybe a MethodReturnTypePattern would exclude the AnnotatedPattern from
> TypePattern?
>
> Thanks for all the quick responses!
>
> Jay
>
>
>
> On May 6, 2013, at 2:25 PM, Andy Clement <andrew.clem...@gmail.com> wrote:
>
> Hi Jay,
>
> You actually have an annotated method there, not an annotated return
> value.  So this will match:
>
> @Around( "execution(@ImmutableCollection * *(..))")
>
> *UNLESS* you are on Java8 and are exploiting type annotations?? If you are
> then I should say AspectJ does not yet support type annotations.
>
> cheers,
> Andy
>
>
>
> On 6 May 2013 10:32, Jay Roberts <puda...@gmail.com> wrote:
>
>> I have a simple test case that isn't working, but it seems like it
>> should, could use a bit of help.
>>
>> I have:
>>
>> public class TestReturnAnnotation{
>>  public Object object=null;
>>  public @ImmutableCollection Object getObject(){
>>  return object;
>>  }
>> }
>>
>>
>> And from the advice:
>>
>> @Around( "execution( (@ImmutableCollection *) *(..))")
>>
>> This compiles ok, but the advice does not get applied to
>> TestReturnAnnotation.getObject().  Looking at the spec for MethodPattern,
>> it seems like it should, but I'm obviously missing something.  FWIW, in the
>> aspect, I have another advice
>>
>> @Around( "set(@ImmutableCollection * *) && args(newVal) && target(t)")
>>
>> That is working fine.  Can I have two @Around in the same @Aspect class?
>>
>> Thanks!
>>
>> Jay Roberts
>>
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@eclipse.org
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>>
>>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@eclipse.org
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@eclipse.org
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to