最近写了一个对象复制工具。用到了一个递归模式。
复制功能是实现了,并且性能相较于BeanUtils高将近一倍。但是还是没有解决深复制问题。最近太忙了就没继续做。后续再看看能否解决深复制问题吧。
@Slf4j
public class MakePoUtils {
/**
* 递归获取字段,包含父类
* @param list
* @param clazz
* @return
*/
private static List<Field> recursive(List<Field> list, Class<?> clazz) {
if (clazz != null) {
list.addAll(Arrays.asList(clazz.getDeclaredFields()));
return recursive(list, clazz.getSuperclass());
} else {
return list;
}
}
/**
* 通用DTO组装新对象方法
* 约定:
* 1,dto和po中对应的属性名,类型,必须一致
* 2,getter/setter方法自动生成驼峰结构
* 当检测到传入的属性和po中属性匹配时,反射获取属性值
*
* @param dto 传入的DTO
* @return 带值的po对象
*/
public static <T, D> D makeFor(T dto, D po) {
Assert.notNull(dto, "dto is null");
Assert.notNull(po, "dto is null");
List<Field> dtoFieldList = recursive(new ArrayList<>(), dto.getClass());
List<Field> poFieldList = recursive(new ArrayList<>(), po.getClass());
dtoFieldList.stream().filter(fd->!Modifier.isStatic(fd.getModifiers())).peek(p -> p.setAccessible(true)).forEach(fd -> {
poFieldList.stream().filter(fc->!Modifier.isStatic(fc.getModifiers())).peek(p -> p.setAccessible(true)).forEach(fc -> {
if (fd.getName().equals(fc.getName()) && fd.getType().equals(fc.getType())) {
try {
fc.set(po, fd.get(dto));
} catch (Exception e) {
e.printStackTrace();
throw new ISBException("反射赋值异常");
}
}
});
});
return po;
}
}