反射机制在自定义RPC框架中实现服务端动态调用:服务端根据接口全限定名查实例,用getMethod(methodName, paramTypes)精准定位重载方法,再通过invoke执行业务逻辑并返回结果。

反射机制在自定义 RPC 框架中承担“服务端执行调用”的核心角色:它让服务端无需提前知道具体方法名和参数,仅靠运行时传来的类名、方法名、参数类型和参数值,就能精准定位并执行对应服务逻辑。
服务端接收请求后,用反射调用真实方法
客户端通过代理把方法名、参数类型数组(Class[])、参数值数组(Object[])一并序列化发给服务端。服务端反序列化得到 RpcRequest 对象后,就进入反射执行环节:
- 根据接口全限定名(如
"com.example.HelloService")从本地注册的服务容器中查出对应实现类实例(比如HelloServiceImpl); - 通过
clazz.getMethod(methodName, paramTypes)获取Method对象——这一步依赖参数类型精确匹配,所以paramTypes必须是String.class、int.class等运行时 Class 对象,不能是String.class.getName()这种字符串; - 调用
method.invoke(instance, args)执行实际业务逻辑,返回结果; - 将返回值封装进
RpcResponse,序列化回传给客户端。
关键细节:为什么必须传 Class[] 而不只是类名?
Java 方法重载靠参数类型区分。比如 sayHello(String) 和 sayHello(String, int) 是两个不同方法。如果只传方法名和参数值,反射无法判断该选哪个。所以 RpcRequest 中必须携带 Class[] paramTypes,确保 getMethod 能唯一定位目标方法。常见错误是客户端用 args.getClass() 或硬编码 new Class[]{Object.class},会导致 NoSuchMethodException。
客户端代理如何为反射准备输入?
JDK 动态代理的 InvocationHandler.invoke() 方法里,会自动拿到被调用的 Method 对象:
立即学习“Java免费学习笔记(深入)”;
-
method.getName()→ 填入RpcRequest.methodName; -
method.getParameterTypes()→ 直接作为RpcRequest.paramTypes; -
args(即 invoke 的第三个参数)→ 直接作为RpcRequest.args。
这样传递过去,服务端拿到的就是可直接用于反射的原始类型信息,无需二次解析或猜测。
一个典型调用链示例
假设客户端调用 helloService.sayHello("Alice"):
- 代理拦截,生成
RpcRequest:methodName="sayHello", paramTypes=[String.class], args=["Alice"]; - 服务端收到后,查到
HelloServiceImpl实例; - 执行
HelloServiceImpl.class.getMethod("sayHello", String.class); - 再执行
method.invoke(instance, "Alice"),得到返回字符串"Hello, Alice"; - 包装进
RpcResponse返回。
整个过程对调用方完全透明,就像在调本地方法一样。


















