Java 動(dòng)態(tài)代理類(lèi)的實(shí)現(xiàn)_第1頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余5頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、java 動(dòng)態(tài)代理類(lèi)的實(shí)現(xiàn)java 動(dòng)態(tài)代理類(lèi)的實(shí)現(xiàn)1、動(dòng)態(tài)代理:為目標(biāo)對(duì)象創(chuàng)建一個(gè)代理類(lèi),該代理類(lèi)擁有目標(biāo)對(duì)象的辦法,屬性,同時(shí)也可添加自己的辦法,比如:日志的添加、校驗(yàn)等。2、實(shí)現(xiàn)條件:在java中規(guī)定,要想產(chǎn)生一個(gè)對(duì)象的代理對(duì)象,那么這個(gè)對(duì)象必需要有一個(gè)接口,所以我們第一步就是設(shè)計(jì)這個(gè)對(duì)象的接口,在接口中定義這個(gè)對(duì)象所具有的行為(辦法)2、應(yīng)用場(chǎng)景:當(dāng)用戶要調(diào)用一個(gè)類(lèi)的辦法時(shí),用戶可以通過(guò)調(diào)用代理,代理通過(guò)接口調(diào)用本來(lái)的類(lèi)的辦法,代理在把辦法給用戶前可以添加一些辦法,如錯(cuò)誤日志,用戶類(lèi)的辦法運(yùn)行的時(shí)光來(lái)監(jiān)聽(tīng)類(lèi)辦法的性能。當(dāng)代理完成時(shí)候就是當(dāng)代理調(diào)用辦法時(shí)候,就會(huì)啟動(dòng)invocationh

2、andler里的invoke辦法(在測(cè)試類(lèi)中代理類(lèi)調(diào)用辦法時(shí)有所體現(xiàn))。3、實(shí)例關(guān)鍵點(diǎn):java在jdk1.5之后提供了一個(gè)"java.lang.reflect.proxy"類(lèi),通過(guò)"proxy"類(lèi)提供的一個(gè)newproxyinstance辦法用來(lái)創(chuàng)建一個(gè)對(duì)象的代理對(duì)象,如下所示:static object newproxyinstance(classloader loader, class interfaces, invocationhandler h)newproxyinstance辦法用來(lái)返回一個(gè)代理對(duì)象,這個(gè)辦法總

3、共有3個(gè)參數(shù),classloader loader用來(lái)指明生成代理對(duì)象用法哪個(gè)類(lèi)裝載器,class interfaces用來(lái)指明生成哪個(gè)對(duì)象的代理對(duì)象,通過(guò)接口指定,invocationhandler h用來(lái)指明產(chǎn)生的這個(gè)代理對(duì)象要做什么事情。所以我們只需要調(diào)用newproxyinstance辦法就可以得到某一個(gè)對(duì)象的代理對(duì)象了。4、實(shí)例如下:1、目標(biāo)對(duì)象接口:public interface people /* * 歌唱 * param name * return */ public string sing(string name); /* * 跳舞 * param name * retur

4、n */ public string dance(string name); 2、實(shí)現(xiàn)接口的目標(biāo)對(duì)象/* * 目標(biāo)類(lèi)對(duì)象 */ public class liudehua implements people override public string sing(string name) return "唱"+name+"歌!好聽(tīng)!" override public string dance(string name) return "跳"+name+"舞!好看!&

5、;quot; 3、代理類(lèi)的實(shí)現(xiàn)/* * 目標(biāo)類(lèi)(liudehua)代理類(lèi) */ public class liudehuaproxy /類(lèi)變量,代理類(lèi)要代理的目標(biāo)對(duì)象 private people ldh = new liudehua(); public people getproxy() return (people) proxy.newproxyinstance(liudehuaproxy.class .getclassloader(), ldh.getclass().getinterfaces(), new invocationhandler() override public obje

6、ct invoke(object proxy, method method, object args) throws throwable /此處可添加目標(biāo)對(duì)象以外的辦法。 /假如調(diào)用的是代理對(duì)象的sing辦法 if (method.getname().equals("sing") return method.invoke(ldh, args); /代理對(duì)象調(diào)用真切目標(biāo)對(duì)象的sing辦法去處理用戶哀求 /假如調(diào)用的是代理對(duì)象的dance辦法 if (method.getname().equals("dance") retur

7、n method.invoke(ldh, args);/代理對(duì)象調(diào)用真切目標(biāo)對(duì)象的dance辦法去處理用戶哀求 return null; ); 4、測(cè)試動(dòng)態(tài)代理類(lèi)調(diào)用過(guò)程public class test public static void main(string args) /代理類(lèi) liudehuaproxy proxy = new liudehuaproxy(); /獲得代理對(duì)象 people p = proxy.getproxy(); /調(diào)用代理對(duì)象的sing辦法 string retvalue = p.sing("冰雨"); system.out.println(retvalu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論