In https://eclipse.org/aspectj/doc/released/README-164.html there is a
section on "Optimizing support for maintaining per join point state" which
talks about how to avoid using a map when you could use an array (using the
id number available from a join point).

Just thinking in a hurry - maybe a percflow(execution(...)) might also be
possible, but I haven't thought that fully through.

cheers,
Andy


On 22 July 2014 07:25, Alexander Kriegisch <alexan...@kriegisch.name> wrote:

> Hi Jon.
>
> I think there is no per-clause for distinct methods. I think your solution
> plus a Map, as you said, probably with keys generated from
>
>     thisJoinPointStaticPart.getSignature().toLongString()
>
> or similar should do. Sorry for not having any better ideas than you by
> yourself.
>
> Regards
> --
> Alexander Kriegisch
> http://scrum-master.de
>
>
> Jon Mann schrieb am 22.07.2014 15:54:
>
> > I have a simple aspect for caching the result of a method call.
> >
> > An annotation is used to mark a method which should be cached:
> >
> >     public @interface CacheResult { }
> >
> > The aspect is implemented like this:
> >
> >     @Aspect("perthis(targetMethod())")
> >     public class CacheResultAspect {
> >
> >         private Object result;
> >
> >         @Pointcut("execution(@CacheResult * *.*())")
> >         public void targetMethod() { }
> >
> >         @Around("targetMethod()")
> >         public Object aroundMethod(ProceedingJoinPoint thisJoinPoint)
> > throws Throwable {
> >             if (result == null) {
> >                 result = thisJoinPoint.proceed();
> >             }
> >             return result;
> >         }
> >     }
> >
> > This works great for target classes with only one @CacheResult method.
> >
> > But the problem is target classes which have multiple different
> > @CacheResult methods:
> >
> >     class Target {
> >         @CacheResult String method1() { return "method1"; }
> >         @CacheResult String method2() { return "method2"; }
> >     }
> >
> >     Target target = new Target();
> >     target.method1();   // Caches and returns "method1"
> >     target.method2();   // Returns cached "method1" but should
> > separately cache and return "method2"
> >
> > Currently, one instance of CacheResultAspect is created for each
> > instance of a target class, so the cache result is (incorrectly) shared
> > across all the @CacheResult methods of the target object.
> >
> > Is there a way to make AspectJ create a separate instance of
> > CacheResultAspect for each @CacheResult method in a target object?
> >
> > I could use a Map to work around this, but perhaps there is a better or
> > more performant solution?
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@eclipse.org
> To change your delivery options, retrieve your password, or unsubscribe
> from this list, visit
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to