通过json恢复序列化和反序列化做方法恢复调用
- 方法调用异常的时候通过切面将方法现场保存
- 后端启动定时任务,定时将方法调用数据获取到,通过反射恢复方法调用
- 获取调用类全称
- 获取调用方法签名:方法名、调用参数类型列表
- 获取调用方法参数列表,通过json序列化保存
- 将上述数据保存在db中,用于后续方法恢复
- 通过调用类名,通过反射实例化对象;对于spring应用,通过getBeanByType找到已经实例化的对象
- 通过方法签名:方法名+调用参数类型 找到具体的方法,通过clazz.getDeclaredMethod(methodName,paramTypes)方法反射拿到要调用的Method
- 通过方法参数json串反序列化,调用method.invoke(bean,param)
刚开始普通类型的数据在做反序列化的时候通过方法上的参数类型做反序列化是没问题的,后来遇到泛型类型的方法调用(List、map类型等)反序列化不能恢复成真实的数据类型(json反序列化如果没有指定类型,会用map类型保存数据)。 解决问题的办法是不能只通过data.gatClass.getType()获取基本类型,还需要记录包装类型里面的数据类型。
两种处理思路:
- 通过方法签名的参数类型获取参数具体类型,这时候类型type比较好通过反射拿到,缺点是如果方法内部有强制类型转化,反序列化的时候会丢数据。这种思路跟一般http 接受json数据的接口处理方式类似
- 通过在保存方法的时候获取数据具体类型,将类型和数据一起保存,然后恢复数据的时候拿到根据保存的类型做反序列化
反序列化的思路:
- 土办法,将常见的类型做正则判断,符合条件的执行对应的json反序列化方法
- 直接复用json处理框架,用已有的功能反序列化