package org.framework.proxy; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * Created by lizhaoz on 2015/12/20. */ public class ProxyChain { private final Class<?> targetClass; //目标类 private final Object targetObject;//目标对象 private final Method targetMethod;//目标方法 private final MethodProxy methodProxy;//方法代理 private final Object[] methodParams;//方法参数 private List<Proxy> proxyList=new ArrayList<Proxy>(); //代理列表 private int proxyIndex = 0;//代理索引 public ProxyChain(Class<?> targetClass, Object targetObject, Method targetMethod, MethodProxy methodProxy, Object[] methodParams, List<Proxy> proxyList) { this.targetClass = targetClass; this.targetObject = targetObject; this.targetMethod = targetMethod; this.methodProxy = methodProxy; this.methodParams = methodParams; this.proxyList = proxyList; } public Object[] getMethodParams(){ return methodParams; } public Class<?> getTargetClass(){ return targetClass; } public Method getTargetMethod(){ return targetMethod; } public Object doProxyChain() throws Throwable{ Object methodResult; if(proxyIndex<proxyList.size()){ //代理策略,通过proxyIndex来充当代理对象的计数器,若未达到proxyList的上限 //就执行proxy对象的proxy方法 //最后就执行目标对象的业务逻辑方法 methodResult=proxyList.get(proxyIndex++).doProxy(this); }else { //执行业务逻辑方法 methodResult=methodProxy.invokeSuper(targetObject,methodParams); } return methodResult; } }