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