前言
提示:公司前端传入的数据都是base64编码,如果一个一个属性进行get出来在进行解码,需要写一推屎山代码,所以考虑可以用反射进行处理。
解决方法
代码如下(示例):
Map<String, Object> paraMap = new HashMap<>();
try {
Class<? extends XXXX> aClass = XXX.getClass();
Field[] fields = aClass.getDeclaredFields();//拿全部成员变量
for (Field field : fields) {
// 正常来说前端传入的数据需要校验一定是String类型(BASE64),所以只需要处理BASE64d数据即可
if ("class java.lang.String".equals(
field.getGenericType().toString())) {
// 获取属性名
String fieldName = field.getName();
//你可以在这里排除你不需要验签的属性
// 开启访问私有类型
field.setAccessible(true);
//把第一个字符改为大写 比如name 如何调用他的get方法就是getName
String fieldNameString = fieldName.replaceFirst(fieldName.substring(0, 1), fieldName.substring(0, 1).toUpperCase());
// 如果type是类类型,则前面包含"class ",后面跟类名
Method m = XXX.getClass().getMethod("get" + fieldNameString);
// 调用getter方法获取属性值
Object value = m.invoke(XXX);
// 判断值是否为空,不为空就添加进来
if (value != null) {
paraMap.put(fieldName, new String(Base64Utils.decodeFromString(String.valueOf(value))));
}
}
}
} catch (Exception e) {
new RestServiceException("反射构造验签数据异常:" + e.getMessage()).handle();
}