0. 用到的技术
- 反射
- 获取正在执行的方法名称
- Class[]数组的获取
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"); //默认形参第一个为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. 小瑕疵
获取参数还需要手动填写,目前没有找到获取正在执行方法的参数的方法
如果各位大佬有方法麻烦评论一下