使用反射重新执行不同的方法
0. 用到的技术
1. 为什么要这样做?
情况如下:
当我调用sendCommands方法发送请求时可能会收到errorCode为403也就是代码中的MDS_ERROR,就是当token(mds)失效了这种情况,我们就需要重新刷新token,并且重新执行该方法
假设还有100个sendCommands类似的方法都需要做这种处理,那么我就需要对这个100个方法做相同的处理.所以想到了用反射来帮我重新执行方法
2. 反射改造
改造如下:
使用redo方法的好处就是以后其他方法只要有类似操作只需要调用redo方法即可,不需要再去写一次相同代码,并且是通过反射自动完成的
如果有除了MDS_ERROR以外的errorCode也需要统一处理只需要在else if即可
此处有个坑,我本来想用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"); //默认形参第一个为mdslog.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. 小瑕疵
获取参数还需要手动填写,目前没有找到获取正在执行方法的参数的方法
如果各位大佬有方法麻烦评论一下