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