概要:1動態(tài)代理(過程 角色 Proxy0)? ? 2手寫(InvocationHandler 、2Handler實現(xiàn)、3類加載器、4MyProxy)
一、動態(tài)代理
1、過程
1)Proxy通過傳遞給它的參數(shù)(interfaces/invocationHandler)生成代理類$Proxy0;
2)Proxy通過傳遞給它的參數(shù)(ClassLoader)來加載生成代理類$Proxy0字節(jié)碼文件
2、角色
1業(yè)務(wù)接口Interface、2業(yè)務(wù)實現(xiàn)類target、3業(yè)務(wù)處理類Handler、4JVM在內(nèi)存中生成的動態(tài)代理類$Proxy0






3、$Proxy0

1)實現(xiàn)業(yè)務(wù)接口(Man),客戶端可調(diào)接口方法
2)繼承Proxy,通過構(gòu)造方法將業(yè)務(wù)處理類傳入給父類Proxy進行初始化。(Proxy中存在protected InvocationHandler h;)
最終回調(diào)Handler的invoke完成調(diào)用


二、手寫動態(tài)代理
1InvocationHandler 、2Handler實現(xiàn)、3類加載器、4MyProxy

1、自定義InvocationHandler:

2、實現(xiàn)MyInvocationHandler的業(yè)務(wù)處理Handler:

3、自定義類加載器MyClassLoader:
自己在內(nèi)存中生成動態(tài)代理類,加載
重寫findClass,為在指定路徑下加載指定字節(jié)碼文件:

4、自定義MyProxy(當于JDK的Proxy):
1)根據(jù)interfaces接口構(gòu)造動態(tài)代理類需要方法(利用反射獲?。?/p>
2)動態(tài)生成代理類(.java)進行編譯,生成字節(jié)碼文件(.class),加載
3)實例化構(gòu)造方法(反射機制),初始化業(yè)務(wù)Hanlder

5其他
1)MyProxy的其他方法 編譯:

2)getMethodString方法

3)運行結(jié)果

4)生成的$MyProxy0:

http://m.itdecent.cn/p/58759fef38b8