1 16 17 package com.google.inject; 18 19 import java.lang.reflect.AccessibleObject ; 20 import java.lang.reflect.Method ; 21 import java.util.List ; 22 import net.sf.cglib.proxy.MethodProxy; 23 import org.aopalliance.intercept.MethodInterceptor; 24 import org.aopalliance.intercept.MethodInvocation; 25 26 31 class InterceptorStackCallback implements net.sf.cglib.proxy.MethodInterceptor { 32 33 final MethodInterceptor[] interceptors; 34 final Method method; 35 36 public InterceptorStackCallback(Method method, 37 List <MethodInterceptor> interceptors) { 38 this.method = method; 39 this.interceptors 40 = interceptors.toArray(new MethodInterceptor[interceptors.size()]); 41 } 42 43 public Object intercept(Object proxy, Method method, Object [] arguments, 44 MethodProxy methodProxy) throws Throwable { 45 return new InterceptedMethodInvocation(proxy, methodProxy, arguments) 46 .proceed(); 47 } 48 49 class InterceptedMethodInvocation implements MethodInvocation { 50 51 final Object proxy; 52 final Object [] arguments; 53 final MethodProxy methodProxy; 54 int index = -1; 55 56 public InterceptedMethodInvocation(Object proxy, MethodProxy methodProxy, 57 Object [] arguments) { 58 this.proxy = proxy; 59 this.methodProxy = methodProxy; 60 this.arguments = arguments; 61 } 62 63 public Object proceed() throws Throwable { 64 try { 65 index++; 66 return index == interceptors.length 67 ? methodProxy.invokeSuper(proxy, arguments) 68 : interceptors[index].invoke(this); 69 } 70 finally { 71 index--; 72 } 73 } 74 75 public Method getMethod() { 76 return method; 77 } 78 79 public Object [] getArguments() { 80 return arguments; 81 } 82 83 public Object getThis() { 84 return proxy; 85 } 86 87 public AccessibleObject getStaticPart() { 88 return getMethod(); 89 } 90 } 91 } 92 | Popular Tags |