遞歸模式 實現java對象的複製

最近寫了一個對象複製工具。用到了一個遞歸模式。

複製功能是實現了,並且性能相較於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;
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章