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

news/2024/5/19 2:26:56 标签: java, 反射

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错误代码
java">    /**
     * 重新执行方法
     * @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


http://www.niftyadmin.cn/n/218435.html

相关文章

openpnp - 顶部相机辅助光的选择

文章目录openpnp - 顶部相机辅助光的选择概述折腾的过程简易灯板市售的环形灯(不带漫射板)市售的环形灯(不带漫射板) LED单色光调光控制器.市售的环形灯(带漫射板)市售的环形灯(带漫射板) 自己拆解(降低LED灯路数)ENDopenpnp - 顶部相机辅助光的选择 概述 终于将顶部相机辅…

整体二分

引入 我们看一道题&#xff1a; 给定一个长度为 n(n≤50000)n(n\leq 50000)n(n≤50000) 的数组 a1,a2,...,ana_1 , a_2 , ... , a_na1​,a2​,...,an​ 和 q(q≤10,000)q\ ( q \leq 10,000 )q (q≤10,000) 次询问&#xff0c;每次询问&#xff1a; QQQ iii jjj kkk 表示区间 …

如何实现监控网站和日志记录的功能?Python实践

实现网站日志监控记录&#xff0c;是网站安全的至关重要的。我们可以用Python库来实现。 Python可以通过第三方库实现监控网站和日志记录的功能&#xff0c;下面介绍两个常用的库。 使用requests库监控网站 requests库是一个常用的用于发起HTTP请求的Python库&#xff0c;可…

【c++】“谁想继承我的花呗-.-“继承的学习

文章目录 前言一、继承的语法二、基类和派生类对象赋值转换 1.例子2.继承中的作用域3.派生类的默认成员4.继承与友元5.继承与静态成员6.复杂的菱形继承和菱形虚拟继承总结前言 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在…

Android13 PMS是如何启动的?

作者&#xff1a;Arthas0v0 平常使用安卓实际就是在使用各种app&#xff0c;而下载的app实际是一个apk文件。这个apk文件的安装就交给了PackageManagerService来实现。PackageManagerService的启动也是在SystemServer中。这个过程比较长需要长一点的时间来理。 SystemServer.s…

Linux学习[7]文件权限深入1

文章目录前言1. 文件的各个字段含义2. 修改文件权限3. 有点意思的东西总结前言 前六个博客是基于树莓派的linux教程书籍写的&#xff0c;因为之前的书籍是以树莓派为基准&#xff0c;所以在linux上没有很详细。这个博客开始记录的是我看书过程中遇到的有意思的&#xff0c;没见…

阿里云服务器搭建网站流程by宝塔Linux面板

阿里云服务器安装宝塔面板教程&#xff0c;云服务器吧以阿里云Linux系统云服务器安装宝塔Linux面板为例&#xff0c;先配置云服务器安全组开放宝塔所需端口8888、888、80、443、20和21端口&#xff0c;然后执行安装宝塔面板命令脚本&#xff0c;最后登录宝塔后台安装LNMP&#…

再摘一枚重要奖项!腾讯安全获得云安全联盟CSA 2022安全金盾奖

4月13日&#xff0c;第六届云安全联盟大中华区大会&#xff08;CSA GCR Congress&#xff09;在上海举办&#xff0c;大会由联合国数字安全联盟、上海市经济和信息化委员会、上海市委网络安全和信息化委员会办公室、上海市普陀区人民政府指导&#xff0c;云安全联盟大中华区主办…