摘要:代理的分類代理分為靜態(tài)和動(dòng)態(tài)代理。動(dòng)態(tài)代理代理類在運(yùn)行時(shí)產(chǎn)生,運(yùn)用的反射機(jī)制動(dòng)態(tài)創(chuàng)建而成。動(dòng)態(tài)代理動(dòng)態(tài)代理又可以分為庫提供的和庫提供,這里我們主要講講提供的動(dòng)態(tài)代理。被代理對(duì)象實(shí)現(xiàn)的接口。,用于分派執(zhí)行代理方法。
代理的分類
代理分為靜態(tài)和動(dòng)態(tài)代理。
靜態(tài)代理:硬編碼實(shí)現(xiàn)的代理類,在程序被編譯成.class文件時(shí)代理類就已經(jīng)存在。
動(dòng)態(tài)代理:代理類在運(yùn)行時(shí)產(chǎn)生,運(yùn)用jdk的反射機(jī)制動(dòng)態(tài)創(chuàng)建而成。
靜態(tài)代理可以通過組合的方式來實(shí)現(xiàn),下面看具體的demo實(shí)現(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(); } }
運(yùn)行結(jié)果:
proxy hi
當(dāng)我們?cè)谑褂玫倪^程中發(fā)現(xiàn)ClientObject這個(gè)類隨著業(yè)務(wù)需求的變化已經(jīng)變得不夠用了,這是我們?cè)撛趺崔k?保持著對(duì)修改關(guān)閉,擴(kuò)展開放的原則,我們可以通過上面那種靜態(tài)代理的方式來實(shí)現(xiàn)業(yè)務(wù)需求的變化,當(dāng)然下面還有一種比較靈活的動(dòng)態(tài)代理的方式來處理上面這種case。
動(dòng)態(tài)代理動(dòng)態(tài)代理又可以分為jdk庫提供的和cglib庫提供,這里我們主要講講jdk提供的動(dòng)態(tài)代理。jdk代理對(duì)象是通過java.lang.reflect.Proxy#newProxyInstance來進(jìn)行創(chuàng)建的。
public static Object newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h)
loader:被代理對(duì)象的classloader。
interfaces:被代理對(duì)象實(shí)現(xiàn)的接口。
h:invocation handler,用于分派執(zhí)行代理方法。
下面看下具體的代理實(shí)現(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"; } }
運(yùn)行結(jié)果:
methodName: get
no hi
當(dāng)然可以在代理對(duì)象里面做很多事情,本demo只是簡(jiǎn)單的替換了被代理對(duì)象的函數(shù)體。
使用場(chǎng)景代理的使用場(chǎng)景主要集中在,某一業(yè)務(wù)需要委托代理類集中處理某一業(yè)務(wù)然后再執(zhí)行具體的實(shí)現(xiàn)類的業(yè)務(wù)邏輯。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/66113.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)代理又被稱為代理或接口代理。靜態(tài)代理在編譯時(shí)產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無需實(shí)現(xiàn)接口,通過生成類字節(jié)碼實(shí)現(xiàn)代理,比反射稍快,不存在性能問題,但會(huì)繼承目標(biāo)對(duì)象,需要重寫方法,所以目標(biāo)對(duì)象不能為類。 一、代理模式介紹 代理模式是一種設(shè)計(jì)模式,提供了對(duì)目標(biāo)對(duì)象額外的訪問方式,即通過代理對(duì)象訪問目標(biāo)對(duì)象,這樣可以在不修改原目標(biāo)對(duì)象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對(duì)象的功...
摘要:動(dòng)態(tài)代理深度解析引言說起動(dòng)態(tài)代理,很多人可能都沒有直接去使用過。因?yàn)榈膭?dòng)態(tài)代理只能代理接口,而不能代理原始的類。接下來是真正壓軸的環(huán)節(jié),實(shí)現(xiàn)自己的動(dòng)態(tài)代理類。 Java動(dòng)態(tài)代理深度解析 引言 說起動(dòng)態(tài)代理,很多人可能都沒有直接去使用過。但是只要用過Spring,那動(dòng)態(tài)代理就是一個(gè)是個(gè)繞不過的坎,因?yàn)镾pring的核心特性之一AOP就是基于動(dòng)態(tài)代理來實(shí)現(xiàn)的,那么什么情況下需要用到動(dòng)態(tài)代理...
摘要:除了和外,我們還有最后一招我直接把一個(gè)代理類的源代碼用字符串拼出來,然后基于這個(gè)字符串調(diào)用的編譯期,動(dòng)態(tài)的創(chuàng)建一個(gè)新的文件,然后動(dòng)態(tài)編譯這個(gè)文件,這樣也能得到一個(gè)新的代理類。 面試問題:Java里的代理設(shè)計(jì)模式(Proxy Design Pattern)一共有幾種實(shí)現(xiàn)方式?這個(gè)題目很像孔乙己?jiǎn)栜钕愣沟能钭钟心膸追N寫法? showImg(https://segmentfault.com/...
摘要:動(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)它的。 ...
摘要:要明白,動(dòng)態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動(dòng)態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因?yàn)閯?dòng)態(tài)代理類是繼承自業(yè)務(wù)類,所以該類和方法不能聲明成無法繼承或重寫。者最終都是生成了一個(gè)新的動(dòng)態(tài)代理類對(duì)象。 動(dòng)態(tài)代理 1、先談靜態(tài)代理 對(duì)于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個(gè)抽象類,真實(shí)類繼承自抽象類并重寫其業(yè)務(wù)方法,代理類持有真實(shí)類的對(duì)象實(shí)例,在重寫業(yè)務(wù)方法中通過調(diào)用真實(shí)...
閱讀 3303·2021-11-24 09:39
閱讀 2808·2021-10-12 10:20
閱讀 1916·2019-08-30 15:53
閱讀 3080·2019-08-30 14:14
閱讀 2609·2019-08-29 15:36
閱讀 1127·2019-08-29 14:11
閱讀 1959·2019-08-26 13:51
閱讀 3414·2019-08-26 13:23