基于spring提供的反射工具类,实现通用重试功能

基于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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值