反射工具类解决对象深拷贝问题

工作中经常遇到对象的拷贝问题,但是对象的深拷贝大部分工具类是不支持的,这里

开发过程中遇到过对同一个对象进行拷贝的情况这里使用反射解决

/**
 * @author dlf
 * @date 2023/9/15 17:01
 */
@Data
public class CaptureStatisticsCompany  implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    private Long ID;

    /**
     * 数据权限
     */
    private String deptCode;

    /**
     * 生成时间
     */
    private Date calculationDate;

    /**
     * 0-可用,1-删除
     */
    private Integer deleteFlag;

    /**
     * 备注
     */
    private String REMARK;

    /**
     */
    private Long entInfoCount;

    /**
     */
    private Long perCertOtherCount;

    /**
     * 
     */
    private Long raPlStatCount;

    /**
     * 
     */
    private Long raBtStatCount;

    /**
     */
    private Long gcResPlCount;

    /**
     */
    private Long gcResBtCount;

    /**
     */
    private Long gcComCount;

    /**
     */
    private Long plBaseCount;

    /**
     */
    private Long plSectionCount;

    /**
     */
    private Long plNodeCount;

    /**
     */
    private Long plUrbanStatCount;

    /**
     */
    private Long plRuralStatCount;

    /**
     */
    private Long stationCount;

    /**
     */
    private Long plDeviceCount;

    /**
     */
    private Long emgPlanECount;

    /**
     */
    private Long emgPlanGCount;

    /**
     */
    private Long emgTeamCount;

    /**
     * 已审核应急车辆数据数量
     */
    private Long emgVehicleCount;

    /**
     */
    private Long emgDepotCount;

    /**
     */
    private Long emgMaterialCount;

    /**
     */
    private Long apmEntInfoCount;

    /**
     */
    private Long apmPerCertOtherCount;

    /**
     * 
     */
    private Long apmRaPlStatCount;

    /**
     * 
     */
    private Long apmRaBtStatCount;

    /**
     * 
     */
    private Long apmGcResPlCount;

    /**
     *
     */
    private Long apmGcResBtCount;

    /**
     */
    private Long apmGcComCount;

    /**
     */
    private Long apmPlBaseCount;

    /**
     */
    private Long apmPlSectionCount;

    /**
     */
    private Long apmPlNodeCount;

    /**
     */
    private Long apmPlUrbanStatCount;

    /**
     */
    private Long apmPlRuralStatCount;

    /**
     */
    private Long apmStationCount;

    /**
     */
    private Long apmPlDeviceCount;

    /**
     */
    private Long apmEmgPlanECount;

    /**
     */
    private Long apmEmgPlanGCount;

    /**
     */
    private Long apmEmgTeamCount;

    /**
     */
    private Long apmEmgVehicleCount;

    /**
     */
    private Long apmEmgDepotCount;

    /**
     */
    private Long apmEmgMaterialCount;

    /**
     */
    private Long aprEntInfoCount;

    /**
     */
    private Long aprPerCertOtherCount;

    /**
     * 
     */
    private Long aprRaPlStatCount;

    /**
     * 
     */
    private Long aprRaBtStatCount;

    /**
     */
    private Long aprGcResPlCount;

    /**
     */
    private Long aprGcResBtCount;

    /**
     */
    private Long aprGcComCount;

    /**
     */
    private Long aprPlBaseCount;

    /**
     */
    private Long aprPlSectionCount;

    /**
     */
    private Long aprPlNodeCount;

    /**
     */
    private Long aprPlUrbanStatCount;

    /**
     */
    private Long aprPlRuralStatCount;

    /**
     */
    private Long aprStationCount;

    /**
     */
    private Long aprPlDeviceCount;

    /**
     */
    private Long aprEmgPlanECount;

    /**
     */
    private Long aprEmgPlanGCount;

    /**
     */
    private Long aprEmgTeamCount;

    /**
     */
    private Long aprEmgVehicleCount;

    /**
     */
    private Long aprEmgDepotCount;

    /**
     */
    private Long aprEmgMaterialCount;

    /**
     */
    private String entName;

    /**
     */
    private String entUuid;

}

浅拷贝失效

public class testClone {
    public static void main(String[] args) throws Exception {

        CaptureStatisticsCompany a = new CaptureStatisticsCompany();
        a.setEntInfoCount(1L);
        a.setEntUuid("test01");
        List<CaptureStatisticsCompany> list1 = Arrays.asList(a);
        System.out.println("a:"+a);
        CaptureStatisticsCompany b = new CaptureStatisticsCompany();
        b.setEntUuid("test01");
        b.setApmEntInfoCount(2L);
        System.out.println("b:"+b);
        List<CaptureStatisticsCompany> list2 = Arrays.asList(b);

        System.out.println("list2:"+list2);
        List<CaptureStatisticsCompany> BeanUtilsResult = new ArrayList<>();

        List<CaptureStatisticsCompany> result = new ArrayList<>();
        //单纯使用BeanUtils.copy进行拷贝
        for (CaptureStatisticsCompany company : list1) {

            for (CaptureStatisticsCompany s : list2) {

                if (company.getEntUuid().equals(s.getEntUuid())) {
                    try {
                        //处理浅拷贝失效问题
                        BeanUtils.copyProperties(company,s);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
            BeanUtilsResult.add(company);
        }
        System.err.println(" BeanUtils.copyProperties:"+BeanUtilsResult);
        }

运行结果


a:CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=1, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=null, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)
b:CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=null, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=2, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)
list2:[CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=null, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=2, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)]

 BeanUtils.copyProperties:[CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=1, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=null, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)]


Process finished with exit code 0

在这里插入图片描述

反射的方法进行深拷贝,同时可以自定义获取不为null的值等操作

public class testClone {
    public static void main(String[] args) throws Exception {

        CaptureStatisticsCompany a = new CaptureStatisticsCompany();
        a.setEntInfoCount(1L);
        a.setEntUuid("test01");
        List<CaptureStatisticsCompany> list1 = Arrays.asList(a);
        System.out.println("a:"+a);
        CaptureStatisticsCompany b = new CaptureStatisticsCompany();
        b.setEntUuid("test01");
        b.setApmEntInfoCount(2L);
        System.out.println("b:"+b);
        List<CaptureStatisticsCompany> list2 = Arrays.asList(b);

        System.out.println("list2:"+list2);
        List<CaptureStatisticsCompany> BeanUtilsResult = new ArrayList<>();

        List<CaptureStatisticsCompany> result = new ArrayList<>();
        //单纯使用BeanUtils.copy进行拷贝
       /* for (CaptureStatisticsCompany company : list1) {

            for (CaptureStatisticsCompany s : list2) {

                if (company.getEntUuid().equals(s.getEntUuid())) {
                    try {
                        //处理浅拷贝失效问题
                        BeanUtils.copyProperties(company,s);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
            BeanUtilsResult.add(company);
        }
        System.err.println(" BeanUtils.copyProperties:"+BeanUtilsResult);*/

        for (CaptureStatisticsCompany company : list1) {
            CaptureStatisticsCompany captureStatisticsCompany = BeanUtil.copyProperties(company, CaptureStatisticsCompany.class);
            for (CaptureStatisticsCompany s : list2) {

                if (company.getEntUuid().equals(s.getEntUuid())) {
                    try {
                        //处理浅拷贝失效问题
                        captureStatisticsCompany = (CaptureStatisticsCompany) setValues(objectToMap(s), company);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
            result.add(captureStatisticsCompany);
        }


        /**
         *    // 修改person2的属性,不会影响person1
         *         person2.name = "Bob";
         *         person2.address.street = "456 Broadway";
         */



        System.out.println();

        System.err.println("result:" + result);

    }


    public static HashMap<String, Object> objectToMap(Object obj) {
        HashMap<String, Object> map = new HashMap<>();

        // 获取对象的所有字段
        Field[] fields = obj.getClass().getDeclaredFields();

        // 遍历每个字段,将其添加到Map中
        for (Field field : fields) {
            field.setAccessible(true);
            String fieldName = field.getName();
            try {
                Object fieldValue = field.get(obj);
                if (null != fieldValue) {
                    map.put(fieldName, fieldValue);
                }

            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        return map;
    }


    public static Object setValues(HashMap<String, Object> map, Object company) throws Exception {
        System.out.println("map"+map);
        // 获取CaptureStatisticsCompany类的所有字段
        Field[] fields = CaptureStatisticsCompany.class.getDeclaredFields();

        // 遍历所有字段
        for (Field field : fields) {
            // 获取字段名
            String fieldName = field.getName();

            // 如果map中包含该字段名的键
            if (map.containsKey(fieldName) && !"serialVersionUID".equals(fieldName)) {
                // 设置字段可访问,以便对私有字段进行操作
                field.setAccessible(true);

                // 获取map中该字段名对应的值
                Object value = map.get(fieldName);

                // 将值赋给company对象的该字段
                field.set(company, value);
            }
        }

        // 返回赋值后的company对象
        System.out.println("company"+company);
        return company;
    }
}

输出结果

result:[CaptureStatisticsCompany(ID=null, deptCode=null, calculationDate=null, deleteFlag=null, REMARK=null, entInfoCount=1, perCertOtherCount=null, raPlStatCount=null, raBtStatCount=null, gcResPlCount=null, gcResBtCount=null, gcComCount=null, plBaseCount=null, plSectionCount=null, plNodeCount=null, plUrbanStatCount=null, plRuralStatCount=null, stationCount=null, plDeviceCount=null, emgPlanECount=null, emgPlanGCount=null, emgTeamCount=null, emgVehicleCount=null, emgDepotCount=null, emgMaterialCount=null, apmEntInfoCount=2, apmPerCertOtherCount=null, apmRaPlStatCount=null, apmRaBtStatCount=null, apmGcResPlCount=null, apmGcResBtCount=null, apmGcComCount=null, apmPlBaseCount=null, apmPlSectionCount=null, apmPlNodeCount=null, apmPlUrbanStatCount=null, apmPlRuralStatCount=null, apmStationCount=null, apmPlDeviceCount=null, apmEmgPlanECount=null, apmEmgPlanGCount=null, apmEmgTeamCount=null, apmEmgVehicleCount=null, apmEmgDepotCount=null, apmEmgMaterialCount=null, aprEntInfoCount=null, aprPerCertOtherCount=null, aprRaPlStatCount=null, aprRaBtStatCount=null, aprGcResPlCount=null, aprGcResBtCount=null, aprGcComCount=null, aprPlBaseCount=null, aprPlSectionCount=null, aprPlNodeCount=null, aprPlUrbanStatCount=null, aprPlRuralStatCount=null, aprStationCount=null, aprPlDeviceCount=null, aprEmgPlanECount=null, aprEmgPlanGCount=null, aprEmgTeamCount=null, aprEmgVehicleCount=null, aprEmgDepotCount=null, aprEmgMaterialCount=null, entName=null, entUuid=test01)]

在这里插入图片描述

核心方法

public static HashMap<String, Object> objectToMap(Object obj) {
        HashMap<String, Object> map = new HashMap<>();

        // 获取对象的所有字段
        Field[] fields = obj.getClass().getDeclaredFields();

        // 遍历每个字段,将其添加到Map中
        for (Field field : fields) {
            field.setAccessible(true);
            String fieldName = field.getName();
            try {
                Object fieldValue = field.get(obj);
                if (null != fieldValue) {
                    map.put(fieldName, fieldValue);
                }

            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        return map;
    }


    public static Object setValues(HashMap<String, Object> map, Object company) throws Exception {
        System.out.println("map"+map);
        // 获取CaptureStatisticsCompany类的所有字段
        Field[] fields = CaptureStatisticsCompany.class.getDeclaredFields();

        // 遍历所有字段
        for (Field field : fields) {
            // 获取字段名
            String fieldName = field.getName();

            // 如果map中包含该字段名的键
            if (map.containsKey(fieldName) && !"serialVersionUID".equals(fieldName)) {
                // 设置字段可访问,以便对私有字段进行操作
                field.setAccessible(true);

                // 获取map中该字段名对应的值
                Object value = map.get(fieldName);

                // 将值赋给company对象的该字段
                field.set(company, value);
            }
        }

        // 返回赋值后的company对象
        System.out.println("company"+company);
        return company;
    }

使用

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值