Java實現(xiàn)動態(tài)代理

參考文章:
代理模式及Java實現(xiàn)動態(tài)代理

代碼:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyDemo {
    public static void main(String[] args) {

        //1.創(chuàng)建委托對象
        AbsSubject real = new RealSub();
        
        //2.創(chuàng)建調(diào)用處理器對象
        ProxyHandler handler = new ProxyHandler(real);
        
        //3.動態(tài)生成代理對象
        AbsSubject proxySub = (AbsSubject)Proxy.newProxyInstance(real.getClass().getClassLoader(),
                real.getClass().getInterfaces(), handler);
        
        //4.通過代理對象調(diào)用方法
        proxySub.doJob();
        proxySub.sum(3,  9);
        int m = proxySub.multiply(3, 7);
        System.out.println("multiply result is:"+m);
    }
}

//被代理類的接口
interface AbsSubject {
    void doJob();
    void sum(int a, int b);
    int multiply(int a, int b);
}

//實際的被代理類
class RealSub implements AbsSubject {

    @Override
    public void doJob() {
        // TODO Auto-generated method stub
        System.out.println("i am doing something");
    }

    @Override
    public void sum(int a, int b) {
        System.out.println(a+" + "+b+" = "+(a+b));
    }

    @Override
    public int multiply(int a, int b) {
        // TODO Auto-generated method stub
        System.out.println(a+" * "+ b);
        return a*b;
    }
    
}

//動態(tài)代理的內(nèi)部實現(xiàn),調(diào)用處理器類蟆技,即實現(xiàn) InvocationHandler 接口
//這個類的目的是指定運行時將生成的代理類需要完成的具體任務(包括Preprocess和Postprocess)
//即代理類調(diào)用任何方法都會經(jīng)過這個調(diào)用處理器類
class ProxyHandler implements InvocationHandler {
    private Object realSub;
    
    public ProxyHandler(Object object) {
        realSub = object;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        Object res = method.invoke(realSub, args);
        System.out.println("after");
        return res;
    }   
}

運行截圖:

運行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌再层,老刑警劉巖汁尺,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粥谬,居然都是意外死亡娇妓,警方通過查閱死者的電腦和手機像鸡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哈恰,“玉大人只估,你說我怎么就攤上這事∽疟粒” “怎么了蛔钙?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蓬戚。 經(jīng)常有香客問我,道長宾抓,這世上最難降的妖魔是什么子漩? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮石洗,結(jié)果婚禮上幢泼,老公的妹妹穿的比我還像新娘。我一直安慰自己讲衫,他們只是感情好缕棵,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布孵班。 她就那樣靜靜地躺著,像睡著了一般招驴。 火紅的嫁衣襯著肌膚如雪篙程。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天别厘,我揣著相機與錄音虱饿,去河邊找鬼。 笑死触趴,一個胖子當著我的面吹牛氮发,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冗懦,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼爽冕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了披蕉?” 一聲冷哼從身側(cè)響起颈畸,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚣艇,沒想到半個月后承冰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡食零,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年困乒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贰谣。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡娜搂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吱抚,到底是詐尸還是另有隱情百宇,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布秘豹,位于F島的核電站携御,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏既绕。R本人自食惡果不足惜啄刹,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凄贩。 院中可真熱鬧誓军,春花似錦、人聲如沸疲扎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壹甥,卻和暖如春救巷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盹廷。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工征绸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俄占。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓管怠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缸榄。 傳聞我的和親對象是個殘疾皇子渤弛,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,325評論 25 707
  • 繪圖Quartz2D 什么是圖形上下文,它是用來保存用戶繪制好的內(nèi)容狀態(tài),當我們選擇與哪一個View相關(guān)聯(lián)的時候,...
    BigBossZhu閱讀 301評論 0 1