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