使用反射重新执行不同的方法

文章介绍了如何利用反射技术在遇到特定错误(如MDS_ERROR)时,自动重试方法,以减少重复代码。通过定义一个redo方法,动态获取方法名和参数,根据错误代码决定是否刷新token并重新执行。然而,获取当前方法参数仍存在小问题,需手动输入。
摘要由CSDN通过智能技术生成

0. 用到的技术

  • 反射
  • 获取正在执行的方法名称
  • Class[]数组的获取

1. 为什么要这样做?

情况如下:

当我调用sendCommands方法发送请求时可能会收到errorCode为403也就是代码中的MDS_ERROR,就是当token(mds)失效了这种情况,我们就需要重新刷新token,并且重新执行该方法

假设还有100个sendCommands类似的方法都需要做这种处理,那么我就需要对这个100个方法做相同的处理.所以想到了用反射来帮我重新执行方法

image-20230413173458842

2. 反射改造

改造如下:

image-20230413175550870

使用redo方法的好处就是以后其他方法只要有类似操作只需要调用redo方法即可,不需要再去写一次相同代码,并且是通过反射自动完成的

如果有除了MDS_ERROR以外的errorCode也需要统一处理只需要在else if即可

image-20230413175215747

此处有个坑,我本来想用methodParam 然后map后toArray的但是会爆Object转Class异常

最后我就只有用for循环一个一个装,反正参数个数也不多

redo方法代码如下:

redo方法就是我抽取的公共重做方法

  • methodName 方法名
  • methodParam 方法参数
  • errorCode错误代码
    /**
     * 重新执行方法
     * @param methodName
     * @param methodParam
     * @param errorCode
     * @throws NoSuchMethodException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    public void redo(String methodName, Object[] methodParam, String errorCode) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        if (CarGPSErrorCode.MDS_ERROR.getErrorCode().equals(errorCode)) {
            log.error("==========="+CarGPSErrorCode.MDS_ERROR.getErrorInfo()+"=============");
            JSONObject loginResObj = reUserLogin();
            methodParam[0] = (String) loginResObj.get("mds"); //默认形参第一个为mds
            log.info("=============重新执行"+methodName+"方法===========");
            Class<? extends CarGPSConfig> carGPSConfigClass = this.getClass();
            Class<?>[] classes = new Class[methodParam.length];
            for (int i = 0; i < methodParam.length; i++) {
                classes[i] = methodParam[i].getClass();
            }
            Method method = carGPSConfigClass.getMethod(methodName, classes);
            method.invoke(this, methodParam);
        } else {
            log.error("=============重新执行"+methodName+"方法失败===========");
        }
    }

3. 小瑕疵

获取参数还需要手动填写,目前没有找到获取正在执行方法的参数的方法

如果各位大佬有方法麻烦评论一下

image-20230413175640275

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值