Dubbo之Wrapper生成的子类字节码

直接上图

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类不能正确处理带$的类名
        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在创建Invoker的时候先将ref实现类包装成了一个Wrapper,然后Invoker被调用的时候会触发doInvoke()方法,然后调用Wrapper的invokeMethod()方法。由于Wrapper是一个抽象类,故Wrapper.getWrapper()被调用的时候肯定是利用了字节码增强的技术为Wrapper创建了一个实现类。

查看实现类代码

由于Wrapper子类生成是利用javassist技术来实现的,所以直接将字节码输出到文件Wrapper20.java(最好使用IDEA自带的反编译插件,本人jd显示有问题).

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只是做了一次转发,深层次的作用等待挖掘。。。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay="5000"),另外一种是没有设置延迟暴露或者...
    加大装益达阅读 21,433评论 5 36
  • 感赏儿子今天比较早的完成了作业。感赏儿子今天和我分享了两个非常有意义的电视节目——一个是 《信中国》,一个是关于经...
    郑凯匀阅读 88评论 0 1
  • 从古至今,多少文人墨客泼墨就诗,尽情挥毫洒墨,或是慷慨激昂,振奋人心;或是哀婉缠绵,柔肠百转;或是简约别致,自然清...
    我说如果lpy阅读 504评论 0 1
  • 今天上午4点过醒了,6点过起床跑步,心情还是不好,不过和赵老师聊天后好多了,以至于今天中午午觉睡好了,谢谢你,感...
    艳子_bbfe阅读 192评论 0 0
  • 时间过得真慢,自11月13日参加瘦瘦营开营仪式以来,今天是第三个五日。由于我每日精准记录、执行我的任务清单,每天都...
    小坏蛋格瑞特阅读 634评论 0 0

友情链接更多精彩内容