Dubbo之Wrapper生成的子類(lèi)字節(jié)碼

直接上圖

public class JavassistProxyFactory extends AbstractProxyFactory {

    @SuppressWarnings("unchecked")
    public <T> T getProxy(Invoker<T> invoker, Class<?>[] interfaces) {
        return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker));
    }

    public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
        // TODO Wrapper類(lèi)不能正確處理帶$的類(lèi)名
        final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);
        return new AbstractProxyInvoker<T>(proxy, type, url) {
            @Override
            protected Object doInvoke(T proxy, String methodName, 
                                      Class<?>[] parameterTypes, 
                                      Object[] arguments) throws Throwable {
                return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
            }
        };
    }
}

Dubbo在創(chuàng)建Invoker的時(shí)候先將ref實(shí)現(xiàn)類(lèi)包裝成了一個(gè)Wrapper,然后Invoker被調(diào)用的時(shí)候會(huì)觸發(fā)doInvoke()方法,然后調(diào)用Wrapper的invokeMethod()方法旋恼。由于Wrapper是一個(gè)抽象類(lèi),故Wrapper.getWrapper()被調(diào)用的時(shí)候肯定是利用了字節(jié)碼增強(qiáng)的技術(shù)為Wrapper創(chuàng)建了一個(gè)實(shí)現(xiàn)類(lèi)。

查看實(shí)現(xiàn)類(lèi)代碼

由于Wrapper子類(lèi)生成是利用javassist技術(shù)來(lái)實(shí)現(xiàn)的,所以直接將字節(jié)碼輸出到文件Wrapper20.java(最好使用IDEA自帶的反編譯插件,本人jd顯示有問(wèn)題).

package com.xx.xx.samples.loader;

import com.alibaba.dubbo.common.bytecode.NoSuchPropertyException;
import com.xx.xx.samples.loader.ClassGenerator2.DC;
import com.xx.xx.samples.loader.service.impl.UserServiceImpl;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

public class Wrapper20 extends Wrapper2 implements DC {
    public static String[] pns;
    public static Map pts;
    public static String[] mns;
    public static String[] dmns;
    public static Class[] mts0;
    public static Class[] mts1;
    public static Class[] mts2;

    public String[] getPropertyNames() {
        return pns;
    }

    public boolean hasProperty(String var1) {
        return pts.containsKey(var1);
    }

    public Class getPropertyType(String var1) {
        return (Class)pts.get(var1);
    }

    public String[] getMethodNames() {
        return mns;
    }

    public String[] getDeclaredMethodNames() {
        return dmns;
    }

    public void setPropertyValue(Object var1, String var2, Object var3) {
        try {
            UserServiceImpl var4 = (UserServiceImpl)var1;
        } catch (Throwable var6) {
            throw new IllegalArgumentException(var6);
        }

        throw new NoSuchPropertyException("Not found property \"" + var2 + "\" filed or setter method in class com.xx.xx.samples.loader.service.impl.UserServiceImpl.");
    }

    public Object getPropertyValue(Object var1, String var2) {
        try {
            UserServiceImpl var3 = (UserServiceImpl)var1;
        } catch (Throwable var5) {
            throw new IllegalArgumentException(var5);
        }

        throw new NoSuchPropertyException("Not found property \"" + var2 + "\" filed or setter method in class com.xx.xx.samples.loader.service.impl.UserServiceImpl.");
    }

    public Object invokeMethod(Object var1, String var2, Class[] var3, Object[] var4) throws InvocationTargetException {
        UserServiceImpl var5;
        try {
            var5 = (UserServiceImpl)var1;
        } catch (Throwable var8) {
            throw new IllegalArgumentException(var8);
        }

        try {
            if ("findUserList".equals(var2) && var3.length == 0) {
                return var5.findUserList();
            }

            if ("findById".equals(var2) && var3.length == 1) {
                return var5.findById((Integer)var4[0]);
            }

            if ("updateById".equals(var2) && var3.length == 1) {
                var5.updateById((Integer)var4[0]);
                return null;
            }
        } catch (Throwable var9) {
            throw new InvocationTargetException(var9);
        }

        throw new NoSuchMethodException("Not found method \"" + var2 + "\" in class com.xx.xx.samples.loader.service.impl.UserServiceImpl.");
    }

    public Wrapper20() {
    }
}

可知invokeMethod只是做了一次轉(zhuǎn)發(fā),深層次的作用等待挖掘镀娶。。举娩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斜友,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哄啄,更是在濱河造成了極大的恐慌誓禁,老刑警劉巖懈息,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異摹恰,居然都是意外死亡辫继,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)俗慈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姑宽,“玉大人,你說(shuō)我怎么就攤上這事闺阱∨诔担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵酣溃,是天一觀的道長(zhǎng)瘦穆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)赊豌,這世上最難降的妖魔是什么扛或? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮碘饼,結(jié)果婚禮上熙兔,老公的妹妹穿的比我還像新娘。我一直安慰自己艾恼,他們只是感情好住涉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著钠绍,像睡著了一般秆吵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上五慈,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天纳寂,我揣著相機(jī)與錄音,去河邊找鬼泻拦。 笑死毙芜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的争拐。 我是一名探鬼主播腋粥,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼架曹!你這毒婦竟也來(lái)了隘冲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绑雄,失蹤者是張志新(化名)和其女友劉穎展辞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體万牺,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罗珍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脚粟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片覆旱。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖核无,靈堂內(nèi)的尸體忽然破棺而出扣唱,到底是詐尸還是另有隱情,我是刑警寧澤团南,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布噪沙,位于F島的核電站,受9級(jí)特大地震影響已慢,放射性物質(zhì)發(fā)生泄漏曲聂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一佑惠、第九天 我趴在偏房一處隱蔽的房頂上張望朋腋。 院中可真熱鬧,春花似錦膜楷、人聲如沸旭咽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)穷绵。三九已至,卻和暖如春特愿,著一層夾襖步出監(jiān)牢的瞬間仲墨,已是汗流浹背勾缭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留目养,地道東北人俩由。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像癌蚁,于是被迫代替她去往敵國(guó)和親幻梯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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

  • dubbo暴露服務(wù)有兩種情況努释,一種是設(shè)置了延遲暴露(比如delay="5000")碘梢,另外一種是沒(méi)有設(shè)置延遲暴露或者...
    加大裝益達(dá)閱讀 21,258評(píng)論 5 36
  • 感賞兒子今天比較早的完成了作業(yè)。感賞兒子今天和我分享了兩個(gè)非常有意義的電視節(jié)目——一個(gè)是 《信中國(guó)》伐蒂,一個(gè)是關(guān)于經(jīng)...
    鄭凱勻閱讀 70評(píng)論 0 1
  • 從古至今饿自,多少文人墨客潑墨就詩(shī)汰翠,盡情揮毫灑墨,或是慷慨激昂昭雌,振奮人心;或是哀婉纏綿复唤,柔腸百轉(zhuǎn);或是簡(jiǎn)約別致,自然清...
    我說(shuō)如果lpy閱讀 415評(píng)論 0 1
  • 今天上午4點(diǎn)過(guò)醒了烛卧,6點(diǎn)過(guò)起床跑步佛纫,心情還是不好,不過(guò)和趙老師聊天后好多了总放,以至于今天中午午覺(jué)睡好了呈宇,謝謝你,感...
    艷子_bbfe閱讀 168評(píng)論 0 0
  • 時(shí)間過(guò)得真慢局雄,自11月13日參加瘦瘦營(yíng)開(kāi)營(yíng)儀式以來(lái)甥啄,今天是第三個(gè)五日。由于我每日精準(zhǔn)記錄炬搭、執(zhí)行我的任務(wù)清單蜈漓,每天都...
    小壞蛋格瑞特閱讀 509評(píng)論 0 0