This is an automated email from the ASF dual-hosted git repository.
jerrick pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/master by this push:
new e18810b [Dubbo-2446]Fix ClassNotFoundException when load Service
Interface by parent ClassLoader (#2447)
e18810b is described below
commit e18810baba0e2314f11a2c8c080cd58d9af446bf
Author: 邓志 <[email protected]>
AuthorDate: Tue Sep 11 15:32:25 2018 +0800
[Dubbo-2446]Fix ClassNotFoundException when load Service Interface by
parent ClassLoader (#2447)
*
用jarslink做的module隔离,dubbo调用时会抛ClassNotFoundException.经查是ClassLoader不一致。为了严谨,做此修改,以确保Service
Interface和Invocation Interface的ClassLoader是同一个。
* invokerInterface非空判断
---
.../src/main/java/org/apache/dubbo/common/utils/ReflectUtils.java | 8 ++++++++
.../src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java | 8 ++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ReflectUtils.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ReflectUtils.java
index ea499a3..78f7b92 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ReflectUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ReflectUtils.java
@@ -591,6 +591,14 @@ public final class ReflectUtils {
}
}
+ public static Class<?> forName(ClassLoader cl, String name) {
+ try {
+ return name2class(cl, name);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalStateException("Not found class " + name + ",
cause: " + e.getMessage(), e);
+ }
+ }
+
/**
* name to class.
* "boolean" => boolean.class
diff --git
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java
index 077970a..e2b0a66 100644
---
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java
+++
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/RpcUtils.java
@@ -49,7 +49,9 @@ public class RpcUtils {
&& !invocation.getMethodName().startsWith("$")) {
String service =
invocation.getInvoker().getUrl().getServiceInterface();
if (service != null && service.length() > 0) {
- Class<?> cls = ReflectUtils.forName(service);
+ Class<?> invokerInterface =
invocation.getInvoker().getInterface();
+ Class<?> cls = invokerInterface != null ?
ReflectUtils.forName(invokerInterface.getClassLoader(), service)
+ : ReflectUtils.forName(service);
Method method = cls.getMethod(invocation.getMethodName(),
invocation.getParameterTypes());
if (method.getReturnType() == void.class) {
return null;
@@ -71,7 +73,9 @@ public class RpcUtils {
&& !invocation.getMethodName().startsWith("$")) {
String service =
invocation.getInvoker().getUrl().getServiceInterface();
if (service != null && service.length() > 0) {
- Class<?> cls = ReflectUtils.forName(service);
+ Class<?> invokerInterface =
invocation.getInvoker().getInterface();
+ Class<?> cls = invokerInterface != null ?
ReflectUtils.forName(invokerInterface.getClassLoader(), service)
+ : ReflectUtils.forName(service);
Method method = cls.getMethod(invocation.getMethodName(),
invocation.getParameterTypes());
if (method.getReturnType() == void.class) {
return null;