基于spring提供的反射工具类,实现通用重试功能
一,背景:
项目中有需要重试的场景:失败后,记下重试的类名,方法名和参数到数据库。后续通过定时任务扫描,重试。
二,代码实现
特意写了一个反射的工具类,只要传入需要执行的类名和方法名和参数即可通过反射执行该方法。
1,反射工具类
@Component
public class SpringReflectionUtil {
@Resource
private ApplicationContext applicationContext;
public Object springInvokeMethod(String serviceName, String methodName, Object[] params){
Object service = applicationContext.getBean(serviceName);
Class<? extends Object>[] paramClass = null;
if (params != null) {
int paramsLength = params.length;
paramClass = new Class[paramsLength];
for (int index = 0; index < paramsLength; index++) {
paramClass[index] = params[index].getClass();
}
}
// 找到需要执行的方法
Method method = ReflectionUtils.findMethod(service.getClass(), methodName, paramClass);
// 执行方法
return ReflectionUtils.invokeMethod(method, service, params);
}
}
2,测试类
@Component
public class ReflectService {
public void handleBody(String body) {
System.out.println("执行body的内容===================="+body);
}
public void handleUser(User user) {
System.out.println("执行user的内容================="+user.toString());
}
public User handleUser(User user,String body) {
System.out.println("执行user的内容================="+user.toString());
System.out.println("执行body的内容================="+body);
user.setName("我被改名字了,请确认");
return user;
}
}
3,测试用例
@Test
public void dotest() throws Exception{
String body = "hello in body";
User user = new User();
user.setAge(10L);
user.setId(10L);
user.setName("name");
user.setSchool("school");
user.setUid("uid");
Object[] params = {user,body};
long begin = System.currentTimeMillis();
Object object = springReflectionUtil.springInvokeMethod("reflectService", "handleUser", params);
if (object instanceof User) {
User invoke = (User)object;
System.out.println("返回结果============"+invoke.toString());
}
long end = System.currentTimeMillis();
System.out.println("game over cost="+(end-begin));
}
4,执行结果
可以看到单元测试成功并调用了我们指定的方法,并且执行时间非常短,不到1ms,所以看到cost=0