摘要:動(dòng)態(tài)代理能干嘛提供了另外一種實(shí)現(xiàn)接口的方式,不用也能實(shí)現(xiàn)接口。有了動(dòng)態(tài)代理,中的網(wǎng)絡(luò)交互部分可以完全寫在框架中,對(duì)用戶來說編程更加方便。
靜態(tài)代理
public class TargetClass{ void method1() } public class ProxyClass{ private TargetClass target; public void method1(){ target.method1() } }
代理類持有目標(biāo)類的引用
動(dòng)態(tài)代理public interface TargetIntf{ void method1(); } public DynamicProxy implements InvocationHandler{ @Override public Object invoke(Object o, Method method, Object[] args){ //do proxy } } InvocationHandler handler = new DynamicProxy(); Proxy theProxy = (TargetIntf)Proxy.newInstance(hander.getClass().getClassLoader(), new Class[]{TargetIntf.class}, handler); theProxy.method1()
要有接口
要實(shí)現(xiàn)InocationHandler
通過Proxy.newInstance來生成代理類
通過強(qiáng)轉(zhuǎn)取得目標(biāo)類的實(shí)例
如何理解動(dòng)態(tài)代理當(dāng)調(diào)用theProxy的method1時(shí),會(huì)觸發(fā)handler.invoke方法的調(diào)用,方法(Method)和參數(shù)都會(huì)傳遞給invoke方法,invoke方法里面想做什么都行。
為什么Proxy.newInstance可以強(qiáng)轉(zhuǎn)成TargetIntf呢?Proxy.newInstance返回的對(duì)象實(shí)現(xiàn)了TargetIntf接口的方法,所以可以強(qiáng)轉(zhuǎn)。
為什么調(diào)用proxy的method1方法會(huì)調(diào)用到handler的invoke方法?Proxy.newInstance返回的對(duì)象組合了handler,并在method1方法的實(shí)現(xiàn)邏輯中添加了handler.invoke的調(diào)用。
Proxy.newInstance如何動(dòng)態(tài)的實(shí)現(xiàn)TargetIntf的方法并返回對(duì)象實(shí)例呢?動(dòng)態(tài)的生成class文件,java類的信息都是從class文件加載進(jìn)來的,Proxy.newInstance方法中動(dòng)態(tài)的生成了class文件并加載。
動(dòng)態(tài)代理能干嘛?提供了另外一種實(shí)現(xiàn)接口的方式,不用implements也能實(shí)現(xiàn)接口。
可以用來寫框架
試想一下,如果沒有動(dòng)態(tài)代理,dubbo框架如何實(shí)現(xiàn)?
動(dòng)態(tài)代理的dubbo實(shí)現(xiàn):
client和server端都依賴api的接口
client端不實(shí)現(xiàn)api接口,通過動(dòng)態(tài)代理,把a(bǔ)pi接口調(diào)用連接到Invocation.invoke方法上,在此方法中將對(duì)象、方法名、參數(shù)等通過網(wǎng)絡(luò)發(fā)送給server端
server端實(shí)現(xiàn)api的接口,把client端發(fā)送過來的rpc調(diào)用連接到api接口的具體實(shí)現(xiàn)上。
沒有動(dòng)態(tài)代理的實(shí)現(xiàn):
client和server端都依賴api接口
client端實(shí)現(xiàn)api接口,接口的實(shí)現(xiàn)邏輯為把對(duì)象、方法名、參數(shù)等通過網(wǎng)絡(luò)發(fā)送給server端
server端實(shí)現(xiàn)api的接口,把client端發(fā)送過來的rpc調(diào)用連接到api接口的具體實(shí)現(xiàn)上。
有了動(dòng)態(tài)代理,dubbo rpc中的網(wǎng)絡(luò)交互部分可以完全寫在dubbo框架中,對(duì)用戶來說編程更加方便。
沒有動(dòng)態(tài)代理,client端的api實(shí)現(xiàn)代碼也可以通過工具自動(dòng)生成,不過這樣讓框架使用起來更加的復(fù)雜。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/74958.html
摘要:這種語法,在中被稱為動(dòng)態(tài)代理。在動(dòng)態(tài)代理機(jī)制中,這個(gè)角色只能是接口。動(dòng)態(tài)代理就是實(shí)現(xiàn)的技術(shù)之一。 所謂動(dòng)態(tài)代理,指的是語言提供的一種語法,能夠?qū)?duì)對(duì)象中不同方法的調(diào)用重定向到一個(gè)統(tǒng)一的處理函數(shù)中來。python重寫__getattr__函數(shù)能夠做到這一點(diǎn),就連世界上最好的語言也提供稱為魔術(shù)方法的__call。這種語法除了能更好的實(shí)現(xiàn)動(dòng)態(tài)代理外,還是RPC框架實(shí)現(xiàn)原理的一部分。 動(dòng)態(tài)代理...
摘要:動(dòng)態(tài)地代理,可以猜測(cè)一下它的含義,在運(yùn)行時(shí)動(dòng)態(tài)地對(duì)某些東西代理,代理它做了其他事情。所以動(dòng)態(tài)代理的內(nèi)容重點(diǎn)就是這個(gè)。所以下一篇我們來細(xì)致了解下的到底是怎么使用動(dòng)態(tài)代理的。 之前講了《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》,本來打算下一篇講講Srping的AOP的,但是其中會(huì)涉及到Java的動(dòng)態(tài)代理,所以先單獨(dú)一篇來了解下Java的動(dòng)態(tài)代理到底是什么,Java是怎么實(shí)現(xiàn)它的。 ...
摘要:之后通過類的靜態(tài)方法取得一個(gè)代理類實(shí)例再次鄙視自己。值得一提,動(dòng)態(tài)代理把也代理了。總結(jié)動(dòng)態(tài)代理優(yōu)點(diǎn)相比靜態(tài)代理,不用每代理一個(gè)類就得寫一個(gè)新的代理類。缺點(diǎn)只能代理實(shí)現(xiàn)了接口的類,因?yàn)槭菃卫^承,代理類已經(jīng)是類的子類了。 動(dòng)態(tài)代理 這里暫時(shí)只做JDK動(dòng)態(tài)代理分析。動(dòng)態(tài)代理應(yīng)用廣泛,例如AOP。 showImg(https://segmentfault.com/img/bVUmAr?w=21...
摘要:代理模式代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對(duì)象和對(duì)象中的方法時(shí),不是直接操作這個(gè)對(duì)象,還是通過一個(gè)代理對(duì)象來操作這個(gè)實(shí)際的目標(biāo)對(duì)象。 代理模式: 代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對(duì)象和對(duì)象中的方法時(shí),不是直接操作這個(gè)對(duì)象,還是通過一個(gè)代理對(duì)象來操作這個(gè)實(shí)際的目標(biāo)對(duì)象。應(yīng)用場(chǎng)景一般是需要在執(zhí)行某個(gè)已經(jīng)寫好的方法前后再添加一段邏輯,比如執(zhí)行方法前打印日志,或者在執(zhí)行方法之前和之后打時(shí)...
摘要:動(dòng)態(tài)代理是語言中非常經(jīng)典的一種設(shè)計(jì)模式,也是所有設(shè)計(jì)模式中最難理解的一種。本文將通過一個(gè)簡(jiǎn)單的例子模擬動(dòng)態(tài)代理實(shí)現(xiàn),讓你徹底明白動(dòng)態(tài)代理設(shè)計(jì)模式的本質(zhì),文章中可能會(huì)涉及到一些你沒有學(xué)習(xí)過的知識(shí)點(diǎn)或概念。 動(dòng)態(tài)代理是Java語言中非常經(jīng)典的一種設(shè)計(jì)模式,也是所有設(shè)計(jì)模式中最難理解的一種。本文將通過一個(gè)簡(jiǎn)單的例子模擬JDK動(dòng)態(tài)代理實(shí)現(xiàn),讓你徹底明白動(dòng)態(tài)代理設(shè)計(jì)模式的本質(zhì),文章中可能會(huì)涉及到...
閱讀 1068·2023-04-26 02:02
閱讀 2408·2021-09-26 10:11
閱讀 3562·2019-08-30 13:10
閱讀 3751·2019-08-29 17:12
閱讀 727·2019-08-29 14:20
閱讀 2195·2019-08-28 18:19
閱讀 2241·2019-08-26 13:52
閱讀 964·2019-08-26 13:43