對動態(tài)代理的理解

上一篇: 對靜態(tài)代理的理解
接上一篇贴唇,學(xué)習(xí)了靜態(tài)代理后再來看看動態(tài)代理的機制秦陋。
在上一篇博客中灾梦,我們使用靜態(tài)代理實現(xiàn)了在修改登錄模塊代碼的情況下增加上報需求野舶,但是有個缺點:新增登錄方式必須新建代理類,例如要實現(xiàn)QQ登錄巾遭,必須新建QQLogin肉康、QQLoginProxy......,如果這種需求多來一點那代理類會爆炸灼舍,動態(tài)代理可以解決這個問題吼和。

實現(xiàn)

新建動態(tài)代理類:

import org.springframework.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxyHandler implements InvocationHandler {

    private Object realObject;

    public DynamicProxyHandler(Object realObject) {
        this.realObject = realObject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //代理擴展邏輯
        System.out.println("動態(tài)代理類 開始執(zhí)行操作...");
        System.out.println( "打印動態(tài)代理方法Method:" + method);
        return method.invoke(realObject, args);
    }
}

是用方法:

import org.springframework.cglib.proxy.Proxy;
public class Test {
    public static void main(String[] args) {
        //使用賬號密碼登錄
        Login realObject = new Login();
        LoginInterface loginInterface = (LoginInterface) Proxy.newProxyInstance(LoginInterface.class.getClassLoader(), new Class[]{LoginInterface.class}, new DynamicProxyHandler(realObject));
        loginInterface.print();
        loginInterface.test();
        //使用微信登錄
        WechatLogin wechatLogin = new WechatLogin();
        LoginInterface loginInterface1 = (LoginInterface) Proxy.newProxyInstance(LoginInterface.class.getClassLoader(), new Class[]{LoginInterface.class}, new DynamicProxyHandler(wechatLogin));
        loginInterface1.print();
    }
}

打印結(jié)果:

動態(tài)代理類 開始執(zhí)行操作...
打印動態(tài)代理方法Method:public abstract void com.demo.springcloud.client1.client1.LoginInterface.print()
專注于賬號密碼登錄中...
動態(tài)代理類 開始執(zhí)行操作...
打印動態(tài)代理方法Method:public abstract void com.demo.springcloud.client1.client1.LoginInterface.test()
測試打印方法...
動態(tài)代理類 開始執(zhí)行操作...
打印動態(tài)代理方法Method:public abstract void com.demo.springcloud.client1.client1.LoginInterface.print()
專注于微信登錄中...

一個動態(tài)代理實現(xiàn)就完成了,不需要再寫什么LoginProxy和wechatLoginProxy這樣的代理類骑素,一個DynamicProxyHandler 就行了炫乓。

原理

代理類實現(xiàn)了InvocationHandler 類,重寫方法

public Object invoke(Object proxy, Method method, Object[] args) 
proxy: 我們所代理的那個真實對象
method: 我們所要調(diào)用真實對象的某個方法的Method對象
args:  調(diào)用真實對象某個方法時接受的參數(shù)

所以打印結(jié)果里,method打印為

Method:public abstract void com.demo.springcloud.client1.client1.LoginInterface.print()
Method:public abstract void com.demo.springcloud.client1.client1.LoginInterface.test()

調(diào)用哪個方法末捣,就會動態(tài)傳入哪個方法為參數(shù)并執(zhí)行侠姑。
動態(tài)代理相對于靜態(tài)代理優(yōu)勢有以下幾點:
1.不再需要手動創(chuàng)建對應(yīng)代理類,例如:LoginProxy箩做、WechatLoginProxy
2.可以代理任意實現(xiàn)了LoginInterface接口的類對象莽红,并執(zhí)行接口的任意方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市邦邦,隨后出現(xiàn)的幾起案子安吁,更是在濱河造成了極大的恐慌,老刑警劉巖圃酵,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柳畔,死亡現(xiàn)場離奇詭異,居然都是意外死亡郭赐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門确沸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捌锭,“玉大人,你說我怎么就攤上這事罗捎」矍” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵桨菜,是天一觀的道長豁状。 經(jīng)常有香客問我,道長倒得,這世上最難降的妖魔是什么泻红? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮霞掺,結(jié)果婚禮上谊路,老公的妹妹穿的比我還像新娘。我一直安慰自己菩彬,他們只是感情好缠劝,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骗灶,像睡著了一般惨恭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耙旦,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天脱羡,我揣著相機與錄音,去河邊找鬼。 笑死轻黑,一個胖子當(dāng)著我的面吹牛糊肤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氓鄙,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馆揉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抖拦?” 一聲冷哼從身側(cè)響起升酣,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎态罪,沒想到半個月后噩茄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡复颈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年绩聘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耗啦。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡凿菩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帜讲,到底是詐尸還是另有隱情衅谷,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布似将,位于F島的核電站获黔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏在验。R本人自食惡果不足惜玷氏,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望译红。 院中可真熱鬧预茄,春花似錦、人聲如沸侦厚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽召庞。三九已至岛心,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篮灼,已是汗流浹背忘古。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诅诱,地道東北人髓堪。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炮沐。 傳聞我的和親對象是個殘疾皇子争群,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,100評論 1 32
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,967評論 6 13
  • 一、基本概念 1.什么是代理翔试? 在闡述JDK動態(tài)代理之前专控,我們很有必要先來弄明白代理的概念。代理這個詞本身并不是計...
    小李彈花閱讀 16,440評論 2 40
  • 原文: Dyanmic Proxy Classes 介紹 一個動態(tài)代理類是實現(xiàn)了多個接口存在于運行時的類遏餐,這樣,一...
    半黑月缺閱讀 943評論 0 0
  • 知乎上曾有過討論:“獨生子女不敢死不敢窮不敢遠(yuǎn)嫁,因為父母只有我幸冻〈馀樱” 我是獨生女,從小父母在外工作洽损,聚少離多庞溜。環(huán)境...
    夏河馬閱讀 750評論 1 1