dubbo source read -ProxyFactory (XI) of Javassist

Explanation

See " Dubbo source read -ProxyFactory (k) of JdkProxyFactory"

Interface definition

See "dubbo source read -ProxyFactory (k) of JdkProxyFactory"

Class Diagram

JavassistProxyFactory

/**
 * JavaassistRpcProxyFactory
 */
public class JavassistProxyFactory extends AbstractProxyFactory {

    @Override
    @SuppressWarnings("unchecked")
    public <T> T getProxy(Invoker<T> invoker, Class<?>[] interfaces) {
        //<1>javasist动态生成Proxy再调用newinstance
        return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker));
    }

    @Override
    public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
        //<2>Use javasisit dynamically generated interest Wrapper can see generation rules
        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);
            }
        };
    }

}

<1> dynamically generated Proxy

Prxy just a factory

/**
 * @author liqiang
 * @date 2020/3/17 11:27
 * @Description: (what)
 * (why)
 * (how)
 */
public class Proxy0 extends Proxy {
    /**
     * get instance with special handler.
     *
     * @param handler
     * @return instance.
     */
    @Override
    public Object newInstance(java.lang.reflect.InvocationHandler h) {
//<3>
return new proxy0(h); } }

<3>proxy0

public class proxy0 implements com.alibaba.dubbo.rpc.service.EchoService, com.alibaba.dubbo.demo.DemoService {
    public static java.lang.reflect.Method[] methods;
    private java.lang.reflect.InvocationHandler handler;

    public proxy0(java.lang.reflect.InvocationHandler arg0) {
        handler = arg0;
    }

//我服务接口暴露的方法 @Override
public java.lang.String sayHello(java.lang.String arg0) throws Throwable { Object[] args = new Object[1]; args[0] = (String) arg0; Object ret = handler.invoke(this, methods[0], args); return (java.lang.String) ret; } //我服务接口暴露的方法 @Override public void save(vo.TestVo arg0) throws Throwable { Object[] args = new Object[1]; args[0] = (vo.TestVo) arg0; Object ret = handler.invoke(this, methods[1], args); } /** * echo test. * * @param message message. * @return message. */ @Override public java.lang.Object $echo(java.lang.Object arg0) throws Throwable { Object[] args = new Object[1]; args[0] = (java.lang.Object) arg0; Object ret = handler.invoke(this, methods[2], args); return (java.lang.Object) ret; } }

<2> dynamically generated Wrapper

/**
 * @author liqiang
 * @date 2020/3/17 10:56
 * @Description: (what)
 * (why)
 * (how)
 */
class Wrapper1 extends com.alibaba.dubbo.common.bytecode.Wrapper {
    public static String[] pns;
    public static java.util.Map pts;
    public static String[] mns;
    public static String[] dmns;
    public static Class[] mts0;
    public static Class[] mts1;


    @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;
    }

//    /**
//     * get method name array.
//     *
//     * @return method name array.
//     */
//    @Override
//    public String[] getMethodNames() {
//        return new String[0];
//    }
//
//    /**
//     * get method name array.
//     *
//     * @return method name array.
//     */
//    @Override
//    public String[] getDeclaredMethodNames() {
//        return new String[0];
//    }


    @Override
    public void setPropertyValue(Object o, String n, Object v) {
        provider.DemoServiceImpl w;
        try {
            w = ((provider.DemoServiceImpl) 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 provider.DemoServiceImpl.");
    }

    @Override
    public Object getPropertyValue(Object o, String n) {
        provider.DemoServiceImpl w;
        try {
            w = ((provider.DemoServiceImpl) 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 provider.DemoServiceImpl.");
    }

    @Override
    public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws java.lang.reflect.InvocationTargetException {
        
        //这个是暴露接口的实现类
        provider.DemoServiceImpl w;
        try {
            //复制
            w = ((provider.DemoServiceImpl) o);
        } catch (Throwable e) {
            throw new IllegalArgumentException(e);
        }
        try {
            //以下是我暴露的2个方法
            if ("save".equals(n) && p.length == 1) {
                w.save((vo.TestVo) v[0]);
                return null;
            }
            if ("sayHello".equals(n) && p.length == 1) {
                return (String) w.sayHello((java.lang.String) v[0]);
            }
        } catch (Throwable e) {
            throw new java.lang.reflect.InvocationTargetException(e);
        }
        throw new com.alibaba.dubbo.common.bytecode.NoSuchMethodException("Not found method \"" + n + "\" in class provider.DemoServiceImpl.");
    }
}

 

Guess you like

Origin www.cnblogs.com/LQBlog/p/12509644.html