招標網(wǎng)站的服務費怎么做分錄免費網(wǎng)站統(tǒng)計工具
動態(tài)代理和靜態(tài)代理角色一樣
動態(tài)代理的代理類是動態(tài)生成的
動態(tài)代理分為兩大類:
基于接口的動態(tài)代理(JDK 動態(tài)代理)、基于類的動態(tài)代理(cglib)
也可以用 Java 字節(jié)碼實現(xiàn)(Javassist)
Proxy:代理
InvocationHandler:調用處理程序
動態(tài)代理的本質,就是使用反射機制實現(xiàn)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Object target;public void setTarget(Object target) {this.target = target;}//生成得到代理類public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}//處理代理實例,并返回結果@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//動態(tài)代理的本質,就是使用反射機制實現(xiàn)Object result = method.invoke(target, args);return result;}}
客戶端訪問時,
先 new 一個真實角色,
再 new 一個代理角色(本質上這個代理角色不存在)
設置要代理的對象,調用 set 方法
最后動態(tài)生成代理類,調用 getProxy() 方法,強轉成真實角色
總結:
InvocationHandler 是由代理實例的調用處理程序實現(xiàn)的接口
每個代理實例都有一個關聯(lián)的調用處理程序,
當在代理實例上調用方法時,方法調用將被編碼并分派到其調用處理程序的 invoke 方法
Proxy 提供了創(chuàng)建動態(tài)代理類和實例的靜態(tài)方法,它也是由這些方法創(chuàng)建的所有動態(tài)代理類的超類
動態(tài)代理的好處:
1.真實角色操作更純粹,不用去關注公共業(yè)務
2.公共業(yè)務交給代理角色,實現(xiàn)業(yè)務分工
3.公共業(yè)務發(fā)生擴展時,方便集中管理
4.一個動態(tài)代理類代理的是一個接口