最近寫了一個對象複製工具。用到了一個遞歸模式。
複製功能是實現了,並且性能相較於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;
}
}