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个方法:
public interface TestService { String getData(String var1); List<String> getList(); }Wrapper#makeWrapper之后,那么生成的代理类如下:Wrapper子类代码如下:
public class Wrapper0 extends com.alibaba.dubbo.common.bytecode.Wrapper { /** * 属性名, 属性类型 */ public static java.util.Map pts = new HashMap<String, Class<?>>(); public static String[] pns = new String[0]; /** * 所有的方法名 */ public static String[] mns = {"getData"}; /** * 本类中的所有方法名 */ public static String[] dmns = {"getData"}; /** * 一个方法中所有的参数类型 mts[n]属性的个数和方法的个数形同 */ public static Class[] mts0 = {String.class}; public static Class[] mts1 = {List.class}; @Override public String[] getPropertyNames() { return pns; } @Override public boolean hasProperty(String n) { return pts.containsKey(n); } @Override public Class getPropertyType(String n) { return (Class) pts.get(n); } @Override public String[] getMethodNames() { return mns; } @Override public String[] getDeclaredMethodNames() { return dmns; } @Override public void setPropertyValue(Object o, String n, Object v) { per.qiao.service.TestService w; try { w = ((per.qiao.service.TestService) o); } catch (Throwable e) { throw new IllegalArgumentException(e); } throw new com.alibaba.dubbo.common.bytecode.NoSuchPropertyException("Not found property \"" + n + "\" filed or setter method in class per.qiao.service.TestService."); } @Override public Object getPropertyValue(Object o, String n) { per.qiao.service.TestService w; try { w = ((per.qiao.service.TestService) o); } catch (Throwable e) { throw new IllegalArgumentException(e); } if (n.equals("list")) { return w.getList(); } throw new com.alibaba.dubbo.common.bytecode.NoSuchPropertyException("Not found property \"" + n + "\" filed or setter method in class per.qiao.service.TestService."); } /** * 在调用接口时,就时调用的这个方法 @param o 接口实例 @param n 方法名 @param p 参数类型 @param v 参数 */ @Override public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws java.lang.reflect.InvocationTargetException { per.qiao.service.TestService w; try { w = ((per.qiao.service.TestService) o); } catch (Throwable e) { throw new IllegalArgumentException(e); } try { //这个try范围内就是你所需要暴露的所有方法 if ("getData".equals(n) && p.length == 1) { return w.getData((java.lang.String) v[0]); } if ("getList".equals(n) && p.length == 0) { return w.getList(); } } catch (Throwable e) { throw new java.lang.reflect.InvocationTargetException(e); } throw new com.alibaba.dubbo.common.bytecode.NoSuchMethodException("Not found method \"" + n + "\" in class per.qiao.service.TestService."); } }可以认为是重写了JDK的反射机制。