From e90e2966c061d5ba448cf992abe19d280762a878 Mon Sep 17 00:00:00 2001 From: Neal Hu Date: Thu, 6 Oct 2016 10:55:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?interfaces=E5=8F=82=E6=95=B0=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E4=B8=8B=E6=A0=87bug=EF=BC=8Cjavassist=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E6=94=AF=E6=8C=81=E9=99=A4=E5=A3=B0=E6=98=8E=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A4=96=E7=9A=84=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dubbo/rpc/proxy/AbstractProxyFactory.java | 4 +- .../javassist/JavassistProxyFactory.java | 51 +++++++++++++++++-- 2 files changed, 50 insertions(+), 5 deletions(-) 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..8d4caa28b4ba 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,54 @@ 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 ){ + Class[] interfaces = null; + + if (config != null && config.length() > 0) { + String[] types = Constants.COMMA_SPLIT_PATTERN.split(config); + if (types != null && types.length > 0) { + interfaces = new Class[types.length]; + for (int i = 0; i < types.length; i ++) { + interfaces[i] = ReflectUtils.forName(types[i]); + } + } + } + for (int i = 0; i < interfaces.length; i ++) { + try { + if (methodName.equals("getInvocationHandler")) { + Method method = interfaces[i].getMethod(methodName, parameterTypes); + return method.invoke(proxy, arguments); + } + } catch (NoSuchMethodException e) { + + } catch (SecurityException e){ + + } + } + } + + if (obj == null && exception != null ) { + throw exception; + } + + return obj; } }; } From 0abe1129f8724d97b2d1314b3c11d1d72f71954f Mon Sep 17 00:00:00 2001 From: Neal Hu Date: Thu, 6 Oct 2016 16:43:12 +0800 Subject: [PATCH 2/2] fix NPE bug --- .../javassist/JavassistProxyFactory.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) 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 8d4caa28b4ba..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 @@ -59,29 +59,26 @@ protected Object doInvoke(T proxy, String methodName, } if (obj == null ){ - Class[] interfaces = null; if (config != null && config.length() > 0) { String[] types = Constants.COMMA_SPLIT_PATTERN.split(config); if (types != null && types.length > 0) { - interfaces = new Class[types.length]; + for (int i = 0; i < types.length; i ++) { - interfaces[i] = ReflectUtils.forName(types[i]); - } - } - } - for (int i = 0; i < interfaces.length; i ++) { - try { - if (methodName.equals("getInvocationHandler")) { - Method method = interfaces[i].getMethod(methodName, parameterTypes); - return method.invoke(proxy, arguments); + 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){ + + } } - } catch (NoSuchMethodException e) { - - } catch (SecurityException e){ - } - } + } } if (obj == null && exception != null ) {