从0到1实现rpc之重载方法和参数类型转换
13 Mar 2024 |一、存在的问题
1.重载方法在当前的实现中还不支持,调用了会报错。
2.类型转换也还存在问题。
假设定义的接口如下,参数是float类型。
在Provider端接受到的是一个Double类型,这是因为web应用接收的请求后处理的类型。
在反射调用的时候就会报错。
二、解决方法重载问题
在Provider端创建的时候使用完整的方法签名替换方法全限定名。
方法签名:方法名称+参数个数+参数类型
在Consumer端封装请求参数时,传入方法签名即可。
举个例子:
三、解决参数类型转换
在Provider端进行反射之前,处理请求参数。
processArgs()方法负责处理请求每个请求参数,传入的参数和方法参数类型匹配处理。
同理,在Consumer端需要对返回的结果类型进行参数处理。
参数处理工具类是TypeUtils.cast():
1.兼容的父子类型不需要处理;
2.处理数组类型:是一个什么样的数组,对每个值进行处理;
3.处理Map:使用json序列化;
4.基本类型使用封装类型;
四、各种类型的测试:
1.引用类型参数;
2.int类型参数;
3.重载方法;
4.无参方法;
5.int类型参数,String类型返回值;
6.本地方法;
7.int类型参数,int类型返回值;
8.无参方法,String类型返回值;
9.数组类型返回值;
10.数组参数,数组返回值
工程地址:https://github.com/midnight2104/midnight-rpc/tree/lesson3