java 实现深度拷深度转换Bean<->Bean

本文介绍了一个基于Dozer库实现的对象映射工具类,提供了单例模式下DozerMapper的使用方法,包括对象及集合间的属性映射,并提供了一个用于合并相同类型对象属性的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!--dozer-->
        <dependency>
            <groupId>com.github.dozermapper</groupId>
            <artifactId>dozer-core</artifactId>
            <version>6.2.0</version>
        </dependency>
 /**
     * 持有Dozer单例, 避免重复创建DozerMapper消耗资源.
     */
    private static Mapper MAPPER = DozerBeanMapperBuilder.buildDefault();

    /**
     * 基于Dozer转换对象的类型.
     */
    public static <T> T map(Object source, Class<T> destinationClass) {
        if (source == null) {
            return null;
        }
        return MAPPER.map(source, destinationClass);
    }

    /**
     * 基于Dozer转换Collection中对象的类型.
     */
    public static <T> List<T> mapList(Collection sourceList, Class<T> destinationClass) {
        List<T> destinationList = new ArrayList<>();
        for (Object sourceObject : sourceList) {
            destinationList.add(MAPPER.map(sourceObject, destinationClass));
        }
        return destinationList;
    }

    /**
     * 基于Dozer将对象A的值拷贝到对象B中.
     */
    public static void map(Object source, Object destination) {
        MAPPER.map(source, destination);
    }


    /**
     * @param sourceBean *            被提取的对象bean
     * @param targetBean *            用于合并的对象bean
     * @return targetBean 合并后的对象
     * @Title: merge
     * @Description: (因为在使用map方法时遇到有字段没有复制成功 , 所以重写了新方法 , 经试用没问题 。)该方法是用于相同对象不同属性值的合并,如果两个相同对象中同一属性都有值,
     * 那么sourceBean中的值会覆盖tagetBean重点的值
     * @return: Object
     */
    @SuppressWarnings("unused")
    public static Object mergeObject(Object sourceBean, Object targetBean) {
        Class sourceBeanClass = sourceBean.getClass();
        Class targetBeanClass = targetBean.getClass();

        Field[] sourceFields = sourceBeanClass.getDeclaredFields();
        Field[] targetFields = sourceBeanClass.getDeclaredFields();
        for (int i = 0; i < sourceFields.length; i++) {
            Field sourceField = sourceFields[i];
            Field targetField = targetFields[i];
            sourceField.setAccessible(true);
            targetField.setAccessible(true);
            try {
                if (!(sourceField.get(sourceBean) == null) && StringUtils.isNotBlank(sourceField.get(sourceBean).toString())) {
                    targetField.set(targetBean, sourceField.get(sourceBean));
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return targetBean;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值