java反射+动态代理可实现轻量级rpc客户端:通过proxy生成接口代理,invocationhandler拦截调用并封装rpcrequest(含接口名、方法名、参数类型与值),经http发送后解析rpcresponse返回结果,客户端仅依赖接口无需实现。

Java 反射 + 动态代理可以实现一个轻量级 RPC 客户端,核心思路是:客户端不直接持有远程服务接口的实现类,而是通过动态代理生成接口的代理对象;调用代理方法时,拦截请求、序列化参数、发送网络请求、接收响应、反序列化结果并返回。
定义统一的服务接口
RPC 的前提是“接口即契约”。服务提供方和消费方共享同一套接口(如 UserService),但实现只在服务端。客户端只需依赖接口,无需知道具体实现。
示例接口:
public interface UserService {
String getNameById(int id);
void updateUser(User user);
}
用 Proxy + InvocationHandler 拦截方法调用
动态代理负责把本地方法调用转化为远程通信请求。关键在于自定义 InvocationHandler,在 invoke 中完成协议封装与网络交互。
- 获取被调用方法名、参数类型、参数值
- 构造请求对象(含接口名、方法名、参数类型数组、参数值列表)
- 使用 HTTP 或 TCP(如 Netty)发送请求(推荐 JSON + HTTP 简单易调试)
- 等待响应,解析返回值(注意泛型擦除问题,需传回类型信息或约定返回统一包装类)
设计简易 RPC 请求/响应结构
为支持多方法、多参数、泛型返回,建议定义标准请求/响应体:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
public class RpcRequest {
private String interfaceName; // 如 "com.example.UserService"
private String methodName;
private Class>[] paramTypes;
private Object[] args;
}
public class RpcResponse<t> {
private T result;
private String error;
private boolean success;
}</t>
客户端在 invoke 中将 method.getName()、method.getParameterTypes()、args 封装进 RpcRequest,发给服务端;服务端反射调用真实实现后,将结果或异常写入 RpcResponse 返回。
创建代理工厂,一键获取远程服务
封装通用代理创建逻辑,隐藏底层细节:
public class RpcClient {
private final String serverUrl; // 如 "http://localhost:8080/rpc"
public <t> T create(Class<t> interfaceClass) {
return (T) Proxy.newProxyInstance(
interfaceClass.getClassLoader(),
new Class[]{interfaceClass},
new RemoteInvocationHandler(interfaceClass, serverUrl)
);
}
}</t></t>
使用时只需:
UserService userService = new RpcClient("http://127.0.0.1:8080/rpc")
.create(UserService.class);
String name = userService.getNameById(1001); // 实际走 HTTP 请求
补充说明
实际生产中还需考虑超时控制、重试机制、序列化选型(JSON/Hessian/Protobuf)、服务发现、负载均衡等。但基于反射和动态代理的这个骨架,已具备 RPC 的核心特征——“调用远程像调用本地一样”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










