美文网首页
Dubbo Wrapper 原理与实例

Dubbo Wrapper 原理与实例

作者: 金泽祺 | 来源:发表于2019-03-29 11:44 被阅读0次

Dubbo Wrapper 可以认为是一种反射机制。它既可以读写目标实例的字段,也可以调用目标实例的方法。比如

  • Car是接口;RaceCar是实现类,实现了Car;ferrari和porsche是RaceCar的两个实例
  • Dubbo为接口Car生成一个Warpper子类,比如Wrapper0;然后创建Wrapper0的实例wrapper0
  • 通过wrapper0#setPropertyValue来修改ferrari的字段,也可以修改porsche的字段
  • 通过wrapper0#invokeMethod来调用ferrari的方法,也可以调用porsche的方法
  • 优点:通过一个Wrapper0实例就可以操作N个目标接口Car的实例

比如我们有一个Car接口,定义了3个方法:

package org.apache.dubbo.common.bytecode;

public interface Car {
    String getBrand();
    long getWeight();
    void make(String brand, long weight);
}

Wrapper#makeWrapper之后生成的Wrapper子类代码如下:

package org.apache.dubbo.common.bytecode;

public class Wrapper0 extends Wrapper {
    // 字段名列表
    public static String[] pns;

    // 字段名与字段类型的映射关系
    public static java.util.Map<String, Class<?>> pts;

    // 方法名列表
    public static String[] mns;

    // 声明的方法名列表
    public static String[] dmns;

    // 每个public方法的参数类型
    public static Class[] mts0;
    public static Class[] mts1;
    public static Class[] mts2;

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

    public boolean hasProperty(String n) {
        return pts.containsKey($1);
    }

    public Class getPropertyType(String n) {
        return (Class) pts.get($1);
    }

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

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

    public void setPropertyValue(Object o, String n, Object v) {
        org.apache.dubbo.common.bytecode.Car w;
        try {
            w = ((org.apache.dubbo.common.bytecode.Car) $1);
        } catch (Throwable e) {
            throw new IllegalArgumentException(e);
        }
        throw new org.apache.dubbo.common.bytecode.NoSuchPropertyException("Not found property \"" + $2 + "\" field or setter method in class org.apache.dubbo.common.bytecode.Car.");
    }

    public Object getPropertyValue(Object o, String n) {
        org.apache.dubbo.common.bytecode.Car w;
        try {
            w = ((org.apache.dubbo.common.bytecode.Car) $1);
        } catch (Throwable e) {
            throw new IllegalArgumentException(e);
        }
        if ($2.equals("brand")) {
            return ($w) w.getBrand();
        }
        if ($2.equals("weight")) {
            return ($w) w.getWeight();
        }
        throw new org.apache.dubbo.common.bytecode.NoSuchPropertyException("Not found property \"" + $2 + "\" field or setter method in class org.apache.dubbo.common.bytecode.Car.");
    }

    public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws java.lang.reflect.InvocationTargetException {
        org.apache.dubbo.common.bytecode.Car w;
        try {
            w = ((org.apache.dubbo.common.bytecode.Car) $1);
        } catch (Throwable e) {
            throw new IllegalArgumentException(e);
        }
        try {
            if ("make".equals($2) && $3.length == 2) {
                w.make((java.lang.String) $4[0], ((Number) $4[1]).longValue());
                return null;
            }
            if ("getBrand".equals($2) && $3.length == 0) {
                return ($w) w.getBrand();
            }
            if ("getWeight".equals($2) && $3.length == 0) {
                return ($w) w.getWeight();
            }
        } catch (Throwable e) {
            throw new java.lang.reflect.InvocationTargetException(e);
        }
        throw new org.apache.dubbo.common.bytecode.NoSuchMethodException("Not found method \"" + $2 + "\" in class org.apache.dubbo.common.bytecode.Car.");
    }
}

可以认为是重写了JDK的反射机制。

相关文章

  • Dubbo Wrapper 原理与实例

    Dubbo Wrapper 可以认为是一种反射机制。它既可以读写目标实例的字段,也可以调用目标实例的方法。比如 C...

  • RPC

    RPC原理及RPC实例分析 Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

  • 缺少一条注册中心“腿”的Dubbo

    技术需求点:一.dubbo机制和原理;二.构建dubbo调用实例;本文涉及:SpringBoot、Dubbo(包括...

  • Dubbo Proxy 原理与实例

    Java代理 Java代理:通过反射和InvocationHandler回调接口实现 Proxy.newProxy...

  • 架构师进阶实战随堂笔记七

    场景七:微服务架构的服务化和Dubbo、Dubbo框架的原理讲解与案例解析 目录 Dubbo是什么 Dubbo是一...

  • Dubbo 使用入门demo

    上一篇介绍了Dubbo简介和实现原理。 Dubbo 简介 本文主要介绍采用Dubbo与Zookeeper、Spri...

  • Dubbo自适应拓展机制原理与实例

    JDK SPI 基本原理 java.util.ServiceLoader 加载 META-INF/services...

  • 14.Dubbo的封装类

    dubbo在将具体的实现生成invoker的时候其实是生成了一个实现类的Wrapper增强对象 dubbo在启动服...

  • sticky footer布局

    实例 套路 一个展示内容content的容器wrapper 一个展示footer的容器 wrapper设置最小高度...

  • Dubbo注册Provider

    一、与Spring的结合 首先spring注册实例让IOC容器管理实例的方式有注解方式,xml的方式。Dubbo中...

网友评论

      本文标题:Dubbo Wrapper 原理与实例

      本文链接:https://www.haomeiwen.com/subject/qzflbqtx.html