diff --git a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java index 68054d7ddb..13e6a0f987 100644 --- a/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java +++ b/dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmInvoker.java @@ -36,6 +36,7 @@ import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.RpcInvocation; +import org.apache.dubbo.rpc.model.ConsumerModel; import org.apache.dubbo.rpc.model.MethodDescriptor; import org.apache.dubbo.rpc.model.ServiceModel; import org.apache.dubbo.rpc.protocol.AbstractInvoker; @@ -317,11 +318,18 @@ public class InjvmInvoker extends AbstractInvoker { } Object value = originValue; - ClassLoader cl = Thread.currentThread().getContextClassLoader(); + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { - ServiceModel consumerServiceModel = getUrl().getServiceModel(); - if (consumerServiceModel != null) { - Thread.currentThread().setContextClassLoader(consumerServiceModel.getClassLoader()); + // 1. By default, the classloader of the current Thread is the consumer class loader. + ClassLoader consumerClassLoader = contextClassLoader; + ServiceModel serviceModel = getUrl().getServiceModel(); + // 2. If there is a ConsumerModel in the url, the classloader of the ConsumerModel is consumerLoader + if (Objects.nonNull(serviceModel) && serviceModel instanceof ConsumerModel) { + consumerClassLoader = serviceModel.getClassLoader(); + } + // 3. request result copy + if (Objects.nonNull(consumerClassLoader)) { + Thread.currentThread().setContextClassLoader(consumerClassLoader); Type[] returnTypes = RpcUtils.getReturnTypes(invocation); if (returnTypes == null) { return originValue; @@ -334,7 +342,7 @@ public class InjvmInvoker extends AbstractInvoker { } return value; } finally { - Thread.currentThread().setContextClassLoader(cl); + Thread.currentThread().setContextClassLoader(contextClassLoader); } }