概要:1動(dòng)態(tài)代理(過程 角色 Proxy0)? ? 2手寫(InvocationHandler 、2Handler實(shí)現(xiàn)张惹、3類加載器芋肠、4MyProxy)
一、動(dòng)態(tài)代理
1幽崩、過程
1)Proxy通過傳遞給它的參數(shù)(interfaces/invocationHandler)生成代理類$Proxy0苦始;
2)Proxy通過傳遞給它的參數(shù)(ClassLoader)來加載生成代理類$Proxy0字節(jié)碼文件
2、角色
1業(yè)務(wù)接口Interface慌申、2業(yè)務(wù)實(shí)現(xiàn)類target陌选、3業(yè)務(wù)處理類Handler、4JVM在內(nèi)存中生成的動(dòng)態(tài)代理類$Proxy0
3蹄溉、$Proxy0
1)實(shí)現(xiàn)業(yè)務(wù)接口(Man)咨油,客戶端可調(diào)接口方法
2)繼承Proxy,通過構(gòu)造方法將業(yè)務(wù)處理類傳入給父類Proxy進(jìn)行初始化柒爵。(Proxy中存在protected InvocationHandler h;)
最終回調(diào)Handler的invoke完成調(diào)用
二役电、手寫動(dòng)態(tài)代理
1InvocationHandler 、2Handler實(shí)現(xiàn)棉胀、3類加載器法瑟、4MyProxy
1、自定義InvocationHandler:
2唁奢、實(shí)現(xiàn)MyInvocationHandler的業(yè)務(wù)處理Handler:
3霎挟、自定義類加載器MyClassLoader:
自己在內(nèi)存中生成動(dòng)態(tài)代理類,加載
重寫findClass麻掸,為在指定路徑下加載指定字節(jié)碼文件:
4酥夭、自定義MyProxy(當(dāng)于JDK的Proxy):
1)根據(jù)interfaces接口構(gòu)造動(dòng)態(tài)代理類需要方法(利用反射獲取)
2)動(dòng)態(tài)生成代理類(.java)進(jìn)行編譯脊奋,生成字節(jié)碼文件(.class)采郎,加載
3)實(shí)例化構(gòu)造方法(反射機(jī)制),初始化業(yè)務(wù)Hanlder
5其他
1)MyProxy的其他方法 編譯:
2)getMethodString方法
3)運(yùn)行結(jié)果
4)生成的$MyProxy0:
http://www.reibang.com/p/58759fef38b8