diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/proxy/AbstractProxyFactory.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/proxy/AbstractProxyFactory.java index 3ee576b32d28..991d52be287d 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/proxy/AbstractProxyFactory.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/proxy/AbstractProxyFactory.java @@ -39,7 +39,7 @@ public T getProxy(Invoker invoker) throws RpcException { interfaces[0] = invoker.getInterface(); interfaces[1] = EchoService.class; for (int i = 0; i < types.length; i ++) { - interfaces[i + 1] = ReflectUtils.forName(types[i]); + interfaces[i + 2] = ReflectUtils.forName(types[i]); } } } @@ -51,4 +51,4 @@ public T getProxy(Invoker invoker) throws RpcException { public abstract T getProxy(Invoker invoker, Class[] types); -} \ No newline at end of file +} diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/proxy/javassist/JavassistProxyFactory.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/proxy/javassist/JavassistProxyFactory.java index 7e776af539ef..0571fbc958b9 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/proxy/javassist/JavassistProxyFactory.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/proxy/javassist/JavassistProxyFactory.java @@ -15,9 +15,13 @@ */ package com.alibaba.dubbo.rpc.proxy.javassist; +import java.lang.reflect.Method; + +import com.alibaba.dubbo.common.Constants; import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.common.bytecode.Proxy; import com.alibaba.dubbo.common.bytecode.Wrapper; +import com.alibaba.dubbo.common.utils.ReflectUtils; import com.alibaba.dubbo.rpc.Invoker; import com.alibaba.dubbo.rpc.proxy.AbstractProxyFactory; import com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker; @@ -37,13 +41,51 @@ public T getProxy(Invoker invoker, Class[] interfaces) { public Invoker getInvoker(T proxy, Class type, URL url) { // TODO Wrapper类不能正确处理带$的类名 - final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type); + final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type); + final String config = url.getParameter("interfaces"); return new AbstractProxyInvoker(proxy, type, url) { @Override protected Object doInvoke(T proxy, String methodName, Class[] parameterTypes, - Object[] arguments) throws Throwable { - return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments); + Object[] arguments) throws Throwable { + Object obj = null; + Exception exception = null; + + try { + obj = wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments); + return obj; + } catch (Exception e) { + exception = e; + } + + if (obj == null ){ + + if (config != null && config.length() > 0) { + String[] types = Constants.COMMA_SPLIT_PATTERN.split(config); + if (types != null && types.length > 0) { + + for (int i = 0; i < types.length; i ++) { + Class interfaces = ReflectUtils.forName(types[i]); + try { + if (methodName.equals("getInvocationHandler")) { + Method method = interfaces.getMethod(methodName, parameterTypes); + return method.invoke(proxy, arguments); + } + } catch (NoSuchMethodException e) { + + } catch (SecurityException e){ + + } + } + } + } + } + + if (obj == null && exception != null ) { + throw exception; + } + + return obj; } }; }