九益兄、spring aop之jdk動(dòng)態(tài)代理

使用

動(dòng)態(tài)代理有兩個(gè)對(duì)象锻梳,目標(biāo)對(duì)象和代理對(duì)象。使用JDK動(dòng)態(tài)代理净捅,目標(biāo)對(duì)象必須實(shí)現(xiàn)一個(gè)接口疑枯。

public class JdkDynamicProxyTest {

    interface IPerson {
        void say() ;
    }

    static class Person implements IPerson {
        @Override
        public void say() {
            System.out.println("hello world");
        }
    }

    static class JdkProxy implements InvocationHandler {

        //目標(biāo)對(duì)象
        private Object target;

        //得到代理對(duì)象
        public Object getProxy(Object target) {
            this.target = target;
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), this);
        }

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

    public static void main(String[] args) {
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
        JdkProxy jdkProxy = new JdkProxy();
        IPerson person = (IPerson) jdkProxy.getProxy(new Person());
        person.say();
    }
}

原理

要查看JDK動(dòng)態(tài)代理原理,只需要在運(yùn)行的時(shí)候蛔六,增加下面一句話:

 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

會(huì)在項(xiàng)目路徑下生成一個(gè)$Proxy0.class文件荆永,反編譯這個(gè)文件,就能夠明白JDK動(dòng)態(tài)代理原理国章。

final class $Proxy0 extends Proxy implements IPerson {
    private static Method m1;
    private static Method m2;
    private static Method m3;
    private static Method m0;

    public $Proxy0(InvocationHandler var1) throws  {
        super(var1);
    }

    public final boolean equals(Object var1) throws  {
        try {
            return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

    public final String toString() throws  {
        try {
            return (String)super.h.invoke(this, m2, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final void say() throws  {
        try {
            super.h.invoke(this, m3, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final int hashCode() throws  {
        try {
            return (Integer)super.h.invoke(this, m0, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
            m2 = Class.forName("java.lang.Object").getMethod("toString");
            m3 = Class.forName("com.ming.aop.IPerson").getMethod("say");
            m0 = Class.forName("java.lang.Object").getMethod("hashCode");
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }
}

代理的大概結(jié)構(gòu)包括4部分:
靜態(tài)字段:被代理的接口所有方法都有一個(gè)對(duì)應(yīng)的靜態(tài)變量具钥;
靜態(tài)塊:主要是通過反射初始化靜態(tài)變量;
具體每個(gè)代理方法:邏輯都差不多就是 h.invoke液兽,h是Proxy的屬性骂删。主要是調(diào)用我們定義好的invocatinoHandler邏輯,觸發(fā)目標(biāo)對(duì)象target上對(duì)應(yīng)的方法;

public class Proxy implements java.io.Serializable {
    protected InvocationHandler h;
}

構(gòu)造函數(shù):從這里傳入我們InvocationHandler邏輯;構(gòu)造函數(shù)在newProxyInstance方法中通過反射調(diào)用抵碟。

public $Proxy0(InvocationHandler var1) throws  {
    super(var1);
}

protected Proxy(InvocationHandler h) {
    Objects.requireNonNull(h);
    this.h = h;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坏匪,隨后出現(xiàn)的幾起案子拟逮,更是在濱河造成了極大的恐慌,老刑警劉巖适滓,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敦迄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)罚屋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門苦囱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脾猛,你說我怎么就攤上這事撕彤。” “怎么了猛拴?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵羹铅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我愉昆,道長(zhǎng)职员,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任跛溉,我火速辦了婚禮焊切,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芳室。我一直安慰自己专肪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布渤愁。 她就那樣靜靜地躺著牵祟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抖格。 梳的紋絲不亂的頭發(fā)上诺苹,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音雹拄,去河邊找鬼收奔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滓玖,可吹牛的內(nèi)容都是我干的坪哄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼势篡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼翩肌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起禁悠,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤念祭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后碍侦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粱坤,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隶糕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了站玄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枚驻。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖株旷,靈堂內(nèi)的尸體忽然破棺而出再登,到底是詐尸還是另有隱情,我是刑警寧澤灾常,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布霎冯,位于F島的核電站,受9級(jí)特大地震影響钞瀑,放射性物質(zhì)發(fā)生泄漏沈撞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一雕什、第九天 我趴在偏房一處隱蔽的房頂上張望缠俺。 院中可真熱鬧,春花似錦贷岸、人聲如沸壹士。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躏救。三九已至,卻和暖如春螟蒸,著一層夾襖步出監(jiān)牢的瞬間盒使,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工七嫌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留少办,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓诵原,卻偏偏與公主長(zhǎng)得像英妓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绍赛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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