package com.ruoyi.common.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.extra.cglib.CglibUtil; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.List; import java.util.Map; /** * bean深拷贝工具(基于 cglib 性能优异) *

* 重点 cglib 不支持 拷贝到链式对象 * 例如: 源对象 拷贝到 目标(链式对象) * 请区分好`浅拷贝`和`深拷贝`再做使用 * * @author Lion Li */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class BeanCopyUtils { /** * 单对象基于class创建拷贝 * * @param source 数据来源实体 * @param desc 描述对象 转换后的对象 * @return desc */ public static V copy(T source, Class desc) { if (ObjectUtil.isNull(source)) { return null; } if (ObjectUtil.isNull(desc)) { return null; } return CglibUtil.copy(source, desc); } /** * 单对象基于对象创建拷贝 * * @param source 数据来源实体 * @param desc 转换后的对象 * @return desc */ public static V copy(T source, V desc) { if (ObjectUtil.isNull(source)) { return null; } if (ObjectUtil.isNull(desc)) { return null; } CglibUtil.copy(source, desc); return desc; } /** * 列表对象基于class创建拷贝 * * @param sourceList 数据来源实体列表 * @param desc 描述对象 转换后的对象 * @return desc */ public static List copyList(List sourceList, Class desc) { if (ObjectUtil.isNull(sourceList)) { return null; } if (CollUtil.isEmpty(sourceList)) { return CollUtil.newArrayList(); } return CglibUtil.copyList(sourceList, () -> ReflectUtil.newInstanceIfPossible(desc)); } /** * bean拷贝到map * * @param bean 数据来源实体 * @return map对象 */ public static Map copyToMap(T bean) { if (ObjectUtil.isNull(bean)) { return null; } return CglibUtil.toMap(bean); } /** * map拷贝到bean * * @param map 数据来源 * @param beanClass bean类 * @return bean对象 */ public static T mapToBean(Map map, Class beanClass) { if (MapUtil.isEmpty(map)) { return null; } if (ObjectUtil.isNull(beanClass)) { return null; } return CglibUtil.toBean(map, beanClass); } /** * map拷贝到bean * * @param map 数据来源 * @param bean bean对象 * @return bean对象 */ public static T mapToBean(Map map, T bean) { if (MapUtil.isEmpty(map)) { return null; } if (ObjectUtil.isNull(bean)) { return null; } return CglibUtil.fillBean(map, bean); } }