Spring-AOP_03-動態(tài)代理-JDK動態(tài)代理

JDK動態(tài)代理是這樣一種Class:
  • 在運行時生成class,
  • 在生成他時,必須提供一組interfaces給它,然后該class就會聲明它實現(xiàn)了這些interfaces.因此我們可以將該class的實例當做這些interfaces中的任何一個來用.
  • 當然這個動態(tài)代理其實就是一個Proxy,它不會代替你做實質(zhì)性的工作,在生成他的實例時,你必須提供一個handler,由它接管實際的工作.
個人感覺這么去理解JDK動態(tài)代理:
  • 1.按照什么規(guī)則,提供一個什么
  • 2.替,具體做什么事.

映射一下

1.類加載器按照給定的接口規(guī)則,提供(創(chuàng)建)了一個代理類.
2.替目標類(被代理的類),具體做InvocationHandler實現(xiàn)的邏輯.


JDK動態(tài)代理 只能代理接口,核心代碼理解:

1.類加載器按照給定的接口規(guī)則,提供(創(chuàng)建)了一個代理類.

//返回代理類的一個實例,返回后的代理類可以當做被代理類使用
static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)

loader:類加載器,用于創(chuàng)建代理類實例
interfaces:實現(xiàn)的接口,標識代理類實現(xiàn)了哪些接口
invocationHandler:實際代理內(nèi)容的實現(xiàn).

2.替目標類(被代理的類),具體做InvocationHandler實現(xiàn)的邏輯.

//InvocationHandler 類中的方法
public Object invoke(Object obj,Method method,Object[] args)

obj: 一般指代理對象 代理對象已經(jīng)被創(chuàng)建了,傳遞到這里,
method:被代理的方法,指定的接口中的方法
args:該方法的參數(shù)數(shù)組.實際方法調(diào)用時候的實際參數(shù)數(shù)組

上述兩個方法位于java.lang.reflect包下,從包名看出屬于反射的范疇.


public interface Subject {
    public void request();
}
public class RealSubject implements Subject {
    public void request() {
        System.out.println("From real subject");
    }
}
public class DynamicSubject implements InvocationHandler {
    private  Object sub;
    public DynamicSubject(Object obj){
        this.sub = obj;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //proxy 是代理對象,不是真實對象.
        System.out.println("before calling: " + method);
        //這里使用的sub是被代理的對象的實例.
        method.invoke(sub,args);//sub:對象(對應(yīng)到面向?qū)ο笾袑嵗椒ㄖ械膖his) args:方法參數(shù)(對應(yīng)到類中的實例方法運行時參數(shù))
        System.out.println(args == null);
        System.out.println("after calling: " + method);
        return null;
    }
}
//JDK動態(tài)代理實現(xiàn)步驟
//1.創(chuàng)建一個實現(xiàn)接口InvocationHandler的類,它必須實現(xiàn)invoke方法
//2.創(chuàng)建被代理的類以及接口(類實現(xiàn)此接口)因為JDK動態(tài)代理的規(guī)則,必須有接口
//3.通過Proxy的靜態(tài)方法 newProxyInstance()創(chuàng)建一個代理
//4.通過代理調(diào)用方法.
public class TestProxy {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();

        InvocationHandler handler = new DynamicSubject(realSubject);
        Class<?> classType = handler.getClass();
        Class<?>[] interfaces = realSubject.getClass().getInterfaces();
        Subject subject = (Subject) Proxy.newProxyInstance(classType.getClassLoader(),interfaces,handler);
        subject.request();
        System.out.println(subject.getClass());
    }
}

運行結(jié)果:

before calling: public abstract void com.zto.learn.Subject.request()
From real subject
true
after calling: public abstract void com.zto.learn.Subject.request()
class com.sun.proxy.$Proxy0

通過這種方式,被代理的對象(RealSubject)可以在運行時動態(tài)概念,需要控制的接口(Subject接口)可以在運行時改變,控制的方式(DynamicSubject類)也 可以動態(tài)改變,從而實現(xiàn)了非常靈活的動態(tài)代理關(guān)系.

一篇不錯的文章:http://www.cnblogs.com/xujian2014/p/4843888.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末某弦,一起剝皮案震驚了整個濱河市洲赵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敞临,老刑警劉巖抗果,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件端盆,死亡現(xiàn)場離奇詭異切黔,居然都是意外死亡,警方通過查閱死者的電腦和手機漩勤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缩搅,“玉大人越败,你說我怎么就攤上這事∮海” “怎么了眉尸?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵域蜗,是天一觀的道長巨双。 經(jīng)常有香客問我,道長霉祸,這世上最難降的妖魔是什么筑累? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮丝蹭,結(jié)果婚禮上慢宗,老公的妹妹穿的比我還像新娘。我一直安慰自己奔穿,他們只是感情好镜沽,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贱田,像睡著了一般缅茉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上男摧,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天蔬墩,我揣著相機與錄音,去河邊找鬼耗拓。 笑死拇颅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的乔询。 我是一名探鬼主播樟插,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼竿刁!你這毒婦竟也來了黄锤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤们妥,失蹤者是張志新(化名)和其女友劉穎猜扮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體监婶,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡旅赢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年齿桃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煮盼。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡短纵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出僵控,到底是詐尸還是另有隱情香到,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布报破,位于F島的核電站悠就,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏充易。R本人自食惡果不足惜梗脾,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盹靴。 院中可真熱鬧炸茧,春花似錦、人聲如沸稿静。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽改备。三九已至控漠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绍妨,已是汗流浹背润脸。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留他去,地道東北人毙驯。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像灾测,于是被迫代替她去往敵國和親爆价。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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

  • title: Jdk動態(tài)代理原理解析 tags:代理 categories:筆記 date: 2017-06-14...
    行徑行閱讀 19,240評論 3 36
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理媳搪,服務(wù)發(fā)現(xiàn)铭段,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • https://blog.csdn.net/luanlouis/article/details/24589193 ...
    小陳阿飛閱讀 856評論 1 1
  • 這個社會上有一個雷打不動的定律是:一切供給過多的東西都會變得廉價秦爆。當然序愚,你的善意也不能免俗。有的人等限,對任何人都友好...
    艾小墨閱讀 368評論 1 1
  • 看了很多文章爸吮,最近在向小文藝的方向前進芬膝,不能說自己升華啦,只是年齡把我推到了這個臺階-初熟形娇。沒啥小野心锰霜,就想給自己...
    Sa小ra閱讀 242評論 0 1