From 55c25e495b2b1eef77f81cfc37f3645361b5927b Mon Sep 17 00:00:00 2001
From: Xiaoyumuxi <3075514079@qq.com>
Date: Mon, 14 Sep 2026 14:30:08 +0800
Subject: [PATCH 01/18] fix: support primitive RPC parameter and return types
---
.../com/xiaoyu/rpc/core/util/TypeUtils.java | 55 +++++++++++++++++++
1 file changed, 55 insertions(+)
create mode 100644 rpc-core/src/main/java/com/xiaoyu/rpc/core/util/TypeUtils.java
diff --git a/rpc-core/src/main/java/com/xiaoyu/rpc/core/util/TypeUtils.java b/rpc-core/src/main/java/com/xiaoyu/rpc/core/util/TypeUtils.java
new file mode 100644
index 0000000..76a3027
--- /dev/null
+++ b/rpc-core/src/main/java/com/xiaoyu/rpc/core/util/TypeUtils.java
@@ -0,0 +1,55 @@
+package com.xiaoyu.rpc.core.util;
+
+import java.util.Map;
+
+/**
+ * RPC 反射调用相关的类型工具。
+ *
+ * Java 基本类型(如 int、boolean)不能直接通过 Class.forName("int") 解析,
+ * 同时多数序列化器也需要使用对应的包装类型进行反序列化。
+ */
+public final class TypeUtils {
+
+ private static final Map> PRIMITIVE_TYPES = Map.ofEntries(
+ Map.entry("boolean", boolean.class),
+ Map.entry("byte", byte.class),
+ Map.entry("short", short.class),
+ Map.entry("int", int.class),
+ Map.entry("long", long.class),
+ Map.entry("float", float.class),
+ Map.entry("double", double.class),
+ Map.entry("char", char.class),
+ Map.entry("void", void.class));
+
+ private static final Map, Class>> WRAPPER_TYPES = Map.ofEntries(
+ Map.entry(boolean.class, Boolean.class),
+ Map.entry(byte.class, Byte.class),
+ Map.entry(short.class, Short.class),
+ Map.entry(int.class, Integer.class),
+ Map.entry(long.class, Long.class),
+ Map.entry(float.class, Float.class),
+ Map.entry(double.class, Double.class),
+ Map.entry(char.class, Character.class),
+ Map.entry(void.class, Void.class));
+
+ private TypeUtils() {
+ }
+
+ /**
+ * 按 JVM/Java 类型名解析 Class,兼容基本类型名称。
+ */
+ public static Class> resolveClass(String typeName) throws ClassNotFoundException {
+ Class> primitiveType = PRIMITIVE_TYPES.get(typeName);
+ return primitiveType != null ? primitiveType : Class.forName(typeName);
+ }
+
+ /**
+ * 将基本类型转换成包装类型,普通引用类型保持不变。
+ */
+ public static Class> wrapPrimitive(Class> type) {
+ if (type == null || !type.isPrimitive()) {
+ return type;
+ }
+ return WRAPPER_TYPES.get(type);
+ }
+}
From d20ce82fcab67c78836c56f73389d007fd153b8c Mon Sep 17 00:00:00 2001
From: Xiaoyumuxi <3075514079@qq.com>
Date: Mon, 14 Sep 2026 14:30:31 +0800
Subject: [PATCH 02/18] fix: deserialize primitive RPC return types
---
.../com/xiaoyu/rpc/core/client/RpcClient.java | 34 ++++++++++++-------
1 file changed, 21 insertions(+), 13 deletions(-)
diff --git a/rpc-core/src/main/java/com/xiaoyu/rpc/core/client/RpcClient.java b/rpc-core/src/main/java/com/xiaoyu/rpc/core/client/RpcClient.java
index 3dd96ab..acc93fb 100644
--- a/rpc-core/src/main/java/com/xiaoyu/rpc/core/client/RpcClient.java
+++ b/rpc-core/src/main/java/com/xiaoyu/rpc/core/client/RpcClient.java
@@ -1,14 +1,19 @@
package com.xiaoyu.rpc.core.client;
import com.xiaoyu.rpc.common.extension.ExtensionLoader;
+import com.xiaoyu.rpc.common.serialization.Serializer;
+import com.xiaoyu.rpc.common.serialization.SerializerCode;
import com.xiaoyu.rpc.common.vo.RpcRequest;
+import com.xiaoyu.rpc.common.vo.RpcResponse;
import com.xiaoyu.rpc.core.config.RpcConfig;
import com.xiaoyu.rpc.core.registry.ServiceDiscovery;
import com.xiaoyu.rpc.core.transport.Transport;
import com.xiaoyu.rpc.core.transport.TransportClient;
+import com.xiaoyu.rpc.core.util.TypeUtils;
import java.net.InetSocketAddress;
import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
public class RpcClient {
@@ -31,37 +36,40 @@ public RpcClient() {
this.serviceDiscovery = Objects.requireNonNull(serviceDiscovery, "serviceDiscovery");
}
- public java.util.concurrent.CompletableFuture