摘要:代理的分類代理分為靜態(tài)和動態(tài)代理。動態(tài)代理代理類在運行時產(chǎn)生,運用的反射機制動態(tài)創(chuàng)建而成。動態(tài)代理動態(tài)代理又可以分為庫提供的和庫提供,這里我們主要講講提供的動態(tài)代理。被代理對象實現(xiàn)的接口。,用于分派執(zhí)行代理方法。
代理的分類
代理分為靜態(tài)和動態(tài)代理。
靜態(tài)代理:硬編碼實現(xiàn)的代理類,在程序被編譯成.class文件時代理類就已經(jīng)存在。
動態(tài)代理:代理類在運行時產(chǎn)生,運用jdk的反射機制動態(tài)創(chuàng)建而成。
靜態(tài)代理可以通過組合的方式來實現(xiàn),下面看具體的demo實現(xiàn):
public class ProxyTest { @Test public void proxyMethodTest() { StaticProxy staticProxy = new StaticProxy(new ClientObject()); System.out.println(staticProxy.get()); } } interface ClientObjectInterface { public String get (); } class ClientObject implements ClientObjectInterface { public String get () { return "hi"; } } class StaticProxy implements ClientObjectInterface { ClientObject clientObject; public StaticProxy(ClientObject clientObject) { this.clientObject = clientObject; } public String get() { return "proxy " + clientObject.get(); } }
運行結(jié)果:
proxy hi
當我們在使用的過程中發(fā)現(xiàn)ClientObject這個類隨著業(yè)務(wù)需求的變化已經(jīng)變得不夠用了,這是我們該怎么辦?保持著對修改關(guān)閉,擴展開放的原則,我們可以通過上面那種靜態(tài)代理的方式來實現(xiàn)業(yè)務(wù)需求的變化,當然下面還有一種比較靈活的動態(tài)代理的方式來處理上面這種case。
動態(tài)代理動態(tài)代理又可以分為jdk庫提供的和cglib庫提供,這里我們主要講講jdk提供的動態(tài)代理。jdk代理對象是通過java.lang.reflect.Proxy#newProxyInstance來進行創(chuàng)建的。
public static Object newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h)
loader:被代理對象的classloader。
interfaces:被代理對象實現(xiàn)的接口。
h:invocation handler,用于分派執(zhí)行代理方法。
下面看下具體的代理實現(xiàn)demo:
public class ProxyTest { @Test public void proxyMethodTest() { ClientObject clientObject = new ClientObject(); ClientObjectInterface object = (ClientObjectInterface) Proxy.newProxyInstance( clientObject.getClass().getClassLoader(), clientObject.getClass().getInterfaces(), new ObjectProxy()); System.out.println(object.get()); } } interface ClientObjectInterface { public String get (); } class ClientObject implements ClientObjectInterface { public String get () { return "hi"; } } class ObjectProxy implements InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("methodName: " + method.getName()); return "no hi"; } }
運行結(jié)果:
methodName: get
no hi
當然可以在代理對象里面做很多事情,本demo只是簡單的替換了被代理對象的函數(shù)體。
使用場景代理的使用場景主要集中在,某一業(yè)務(wù)需要委托代理類集中處理某一業(yè)務(wù)然后再執(zhí)行具體的實現(xiàn)類的業(yè)務(wù)邏輯。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66113.html
摘要:這種語法,在中被稱為動態(tài)代理。在動態(tài)代理機制中,這個角色只能是接口。動態(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)代理在編譯時產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無需實現(xiàn)接口,通過生成類字節(jié)碼實現(xiàn)代理,比反射稍快,不存在性能問題,但會繼承目標對象,需要重寫方法,所以目標對象不能為類。 一、代理模式介紹 代理模式是一種設(shè)計模式,提供了對目標對象額外的訪問方式,即通過代理對象訪問目標對象,這樣可以在不修改原目標對象的前提下,提供額外的功能操作,擴展目標對象的功...
摘要:動態(tài)代理深度解析引言說起動態(tài)代理,很多人可能都沒有直接去使用過。因為的動態(tài)代理只能代理接口,而不能代理原始的類。接下來是真正壓軸的環(huán)節(jié),實現(xiàn)自己的動態(tài)代理類。 Java動態(tài)代理深度解析 引言 說起動態(tài)代理,很多人可能都沒有直接去使用過。但是只要用過Spring,那動態(tài)代理就是一個是個繞不過的坎,因為Spring的核心特性之一AOP就是基于動態(tài)代理來實現(xiàn)的,那么什么情況下需要用到動態(tài)代理...
摘要:除了和外,我們還有最后一招我直接把一個代理類的源代碼用字符串拼出來,然后基于這個字符串調(diào)用的編譯期,動態(tài)的創(chuàng)建一個新的文件,然后動態(tài)編譯這個文件,這樣也能得到一個新的代理類。 面試問題:Java里的代理設(shè)計模式(Proxy Design Pattern)一共有幾種實現(xiàn)方式?這個題目很像孔乙己問茴香豆的茴字有哪幾種寫法? showImg(https://segmentfault.com/...
摘要:動態(tài)地代理,可以猜測一下它的含義,在運行時動態(tài)地對某些東西代理,代理它做了其他事情。所以動態(tài)代理的內(nèi)容重點就是這個。所以下一篇我們來細致了解下的到底是怎么使用動態(tài)代理的。 之前講了《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》,本來打算下一篇講講Srping的AOP的,但是其中會涉及到Java的動態(tài)代理,所以先單獨一篇來了解下Java的動態(tài)代理到底是什么,Java是怎么實現(xiàn)它的。 ...
摘要:要明白,動態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因為動態(tài)代理類是繼承自業(yè)務(wù)類,所以該類和方法不能聲明成無法繼承或重寫。者最終都是生成了一個新的動態(tài)代理類對象。 動態(tài)代理 1、先談靜態(tài)代理 對于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個抽象類,真實類繼承自抽象類并重寫其業(yè)務(wù)方法,代理類持有真實類的對象實例,在重寫業(yè)務(wù)方法中通過調(diào)用真實...
閱讀 3329·2021-11-24 09:39
閱讀 2852·2021-10-12 10:20
閱讀 1943·2019-08-30 15:53
閱讀 3104·2019-08-30 14:14
閱讀 2632·2019-08-29 15:36
閱讀 1162·2019-08-29 14:11
閱讀 1981·2019-08-26 13:51
閱讀 3447·2019-08-26 13:23