動態(tài)代理

Java 中的動態(tài)代理

源碼分析實現(xiàn)原理的過程

http://blog.csdn.net/bluetjs/article/details/52263410

步驟

  1. 必須要有一個接口吉殃, Subject

  2. 有一個類實現(xiàn)接口坦敌,RealSubject

  3. 實現(xiàn) InvocationHandler 接口夭拌,書寫代理類的邏輯

  4. 通過 Proxy.newProxyInstance 方法創(chuàng)建代理對象

代碼:

package com.interview.reflect;

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

public class ProxyTest {

    public static void main(String[] args) {
        Subject s = new RealSubject();
        Subject subject = (Subject) Proxy.newProxyInstance(s.getClass().getClassLoader(),
        s.getClass().getInterfaces(), new ProxyHandler<Subject>(s));
        subject.method();
        subject.dream();

    }
}

interface Subject {

    void method();

    void dream();

}

class RealSubject implements Subject {

    @Override
    public void method() {
        System.out.println("method run...");
    }

    @Override
    public void dream() {
        System.out.println("dream come true...");
    }
}

class ProxyHandler<T> implements InvocationHandler {

    private T target;

    public ProxyHandler(T target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before invoke method process<<<<");
        method.invoke(target, args);
        System.out.println("after method invoke process>>>>>>");
        return target;
    }
}

運(yùn)行結(jié)果

before invoke method process
method run...
after method invoke process
before invoke method process
dream come true...
after method invoke process

底層實現(xiàn)

JDK提供了sun.misc.ProxyGenerator.generateProxyClass(String proxyName,class[] interfaces) 底層方法來產(chǎn)生動態(tài)代理類的字節(jié)碼延旧,這是 proxy 的底層實現(xiàn)

仔細(xì)觀察可以看出生成的動態(tài)代理類有以下特點(diǎn):

  1. 繼承自 java.lang.reflect.Proxy,實現(xiàn)了目標(biāo)類需要實現(xiàn)的接口

  2. 類中的所有方法都是 final 的

  3. 所有的方法功能的實現(xiàn)都統(tǒng)一調(diào)用了 InvocationHandler 的 invoke() 方法

cglib 的動態(tài)代理

Java 的動態(tài)代理的缺點(diǎn)是類必須要實現(xiàn)接口斗躏,如果沒有實現(xiàn)接口則無法產(chǎn)生代理贷币。為了應(yīng)對這種情況简烘,于是就產(chǎn)生了 cglib 的動態(tài)代理。

cglib 創(chuàng)建某個類A的動態(tài)代理類的模式是

  1. 查找A上的所有非final 的public類型的方法定義

  2. 將這些方法的定義轉(zhuǎn)換成字節(jié)碼

  3. 將組成的字節(jié)碼轉(zhuǎn)換成相應(yīng)的代理的class對象

  4. 實現(xiàn) MethodInterceptor接口甩恼,用來處理 對代理類上所有方法的請求(這個接口和JDK動態(tài)代理InvocationHandler的功能和角色是一樣的)

其他的字節(jié)碼工具

javaassist蟀瞧,asm

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市条摸,隨后出現(xiàn)的幾起案子悦污,更是在濱河造成了極大的恐慌,老刑警劉巖钉蒲,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件切端,死亡現(xiàn)場離奇詭異,居然都是意外死亡子巾,警方通過查閱死者的電腦和手機(jī)帆赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來线梗,“玉大人椰于,你說我怎么就攤上這事∫巧Γ” “怎么了瘾婿?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烤咧。 經(jīng)常有香客問我偏陪,道長,這世上最難降的妖魔是什么煮嫌? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任笛谦,我火速辦了婚禮,結(jié)果婚禮上昌阿,老公的妹妹穿的比我還像新娘饥脑。我一直安慰自己恳邀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布灶轰。 她就那樣靜靜地躺著谣沸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笋颤。 梳的紋絲不亂的頭發(fā)上乳附,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機(jī)與錄音伴澄,去河邊找鬼赋除。 笑死,一個胖子當(dāng)著我的面吹牛非凌,可吹牛的內(nèi)容都是我干的贤重。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼清焕,長吁一口氣:“原來是場噩夢啊……” “哼并蝗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秸妥,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤滚停,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粥惧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體键畴,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年突雪,在試婚紗的時候發(fā)現(xiàn)自己被綠了起惕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咏删,死狀恐怖惹想,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情督函,我是刑警寧澤嘀粱,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站辰狡,受9級特大地震影響锋叨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宛篇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一娃磺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叫倍,春花似錦偷卧、人聲如沸嘿般。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逼庞,卻和暖如春蛇更,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赛糟。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工派任, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璧南。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓掌逛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親司倚。 傳聞我的和親對象是個殘疾皇子豆混,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

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

  • title: Jdk動態(tài)代理原理解析 tags:代理 categories:筆記 date: 2017-06-14...
    行徑行閱讀 19,259評論 3 36
  • Java代理和動態(tài)代理機(jī)制分析和應(yīng)用 概述 代理是一種常用的設(shè)計模式,其目的就是為其他對象提供一個代理以控制對某個...
    丸_子閱讀 3,022評論 6 57
  • 一动知、代理的概念與作用 1.1皿伺、生活中的代理 杭州人從在杭州本地從杭州的代理商(線下商店)中買聯(lián)想電腦和直接跑到北京...
    俠客有情劍無情QAQ閱讀 8,382評論 3 13
  • 01 在行為心理學(xué)中,一個人的新的習(xí)慣或者理念的形成并得以鞏固至少需要21天盒粮。 而我用21天養(yǎng)成了早起寫作的習(xí)慣鸵鸥。...
    星飛飛閱讀 2,258評論 98 136
  • 2015年對我來說絕對是非常重要的一年妒穴,結(jié)婚生子,完成了人生中非常重要的幾件大事摊崭。 閨女的出生完全出乎我的意料讼油,在...
    程沐閱讀 536評論 8 6