背景:最近做项目时发现调用接口后,返回对象中的值有的空格未处理,字段超长,但是下游系统又有格式要求,不能为null 不能有空格,还有一些字段为null时报文中字段缺失等
写了个小工具类,对返回的对象统一处理下,上代码
package util;
import org.apache.commons.lang.StringUtils;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class ClassBaseUtil {
/**
* 对返回的对象属性赋值 包括 String List
* ① 对于有值的属性 去除空格
* ② 对返回为null 的处理为 ""
*
* 涉及知识点
* Class 类
* getDeclaredFields() 返回的数组 Field对象反映此表示的类或接口声明的所有字段 类对象。
* isAssignableFrom(类<?> cls) 确定由此 类对象表示的类或接口是否与由指定的Class 类表示的类或接口相同或是超类或 类接口。
*
* Field 类
* setAccessible(true) 当isAccessible()的结果是false时不允许通过反射访问该字段
* 当该字段时private修饰时isAccessible()得到的值是false,必须要改成true才可以访问
* getGenericType() 返回一个 Type对象,它表示由该表示的字段的声明类型 Field对象。
* getType() 返回一个 类对象标识了此表示的字段的声明类型 Field对象。
*
* ParameterizedType 接口
* getActualTypeArguments() 返回一个表示此类型的实际类型参数的数组 Type对象。
*
*/
public static void resetClass(Object obj, Class<?> clazz){
if(clazz != null){
try{
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (null == field.get(obj)) {
if("class java.lang.String".equals(field.getGenericType().toString())){
field.set(obj,"");
}else if("interface java,util.List".equals(field.getType().toString())){
List list = new ArrayList();
if(List.class.isAssignableFrom(field.getType())){
Type type = field.getGenericType();
if(type instanceof ParameterizedType){
Class c = (Class) ((ParameterizedType) type).getActualTypeArguments()[0];
Object o = c.newInstance();
resetClass(o,c);
list.add(o);
field.set(obj,list);
}
}
}
}else{
// 返回值非空 null -> "" 去空格
if("class java.lang.String".equals(field.getGenericType().toString())){
if(StringUtils.isBlank(field.get(obj).toString().trim())){
field.set(obj,"");
}else{
String value = field.get(obj).toString().trim();
field.set(obj,value);
}
}else if("interface java,util.List".equals(field.getType().toString())){
List list = new ArrayList();
if(List.class.isAssignableFrom(field.getType())) {
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
Class c = (Class) ((ParameterizedType) type).getActualTypeArguments()[0];
ArrayList infoList = (ArrayList) field.get(obj);
for (Object o : infoList){
resetClass(o,c);
list.add(o);
}
field.set(obj,list);
}
}
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}