1 package com.tirsen.nanning.samples; 2 3 import com.tirsen.nanning.AspectInstance; 4 import com.tirsen.nanning.Invocation; 5 import com.tirsen.nanning.MethodInterceptor; 6 import com.tirsen.nanning.MixinInstance; 7 import com.tirsen.nanning.config.Aspect; 8 import com.tirsen.nanning.config.AttributePointcut; 9 import com.tirsen.nanning.config.Pointcut; 10 11 import java.lang.reflect.Method ; 12 import java.util.Iterator ; 13 import java.util.List ; 14 15 public class CacheAspect implements Aspect { 16 int totalCount; 17 int missCount; 18 private MethodInterceptor cacheInterceptor; 19 private Pointcut pointcut = new AttributePointcut("cache"); 20 21 public CacheAspect(MethodInterceptor cacheInterceptor) { 22 this.cacheInterceptor = cacheInterceptor; 23 } 24 25 public CacheAspect() { 26 this(new CacheInterceptor()); 27 } 28 29 public void introduce(AspectInstance aspectInstance) { 30 } 31 32 public void advise(AspectInstance instance) { 33 List mixins = instance.getMixins(); 34 for (Iterator iterator = mixins.iterator(); iterator.hasNext();) { 35 MixinInstance mixin = (MixinInstance) iterator.next(); 36 Method [] methods = pointcut.methodsToAdvise(instance, mixin); 37 for (int i = 0; i < methods.length; i++) { 38 Method method = methods[i]; 39 mixin.addInterceptor(method, new MethodInterceptor() { 40 public Object invoke(Invocation invocation) throws Throwable { 41 totalCount++; 42 return invocation.invokeNext(); 43 } 44 }); 45 mixin.addInterceptor(method, cacheInterceptor); 46 mixin.addInterceptor(method, new MethodInterceptor() { 47 public Object invoke(Invocation invocation) throws Throwable { 48 missCount++; 49 return invocation.invokeNext(); 50 } 51 }); 52 } 53 } 54 } 55 56 public double getCacheHitRatio() { 57 return totalCount == 0 ? 1 : (totalCount - missCount) / (double) totalCount; 58 } 59 } 60 | Popular Tags |