java-基础-子篇-深拷贝-示例

 

自定义工具类实现深拷贝


import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.FatalBeanException;
import org.springframework.util.Assert;

public abstract class EnhanceBeanUtil extends BeanUtils {
    public EnhanceBeanUtil() {
    }

    public static void copyProperties(Object source, Object target) throws BeansException {
        Assert.notNull(source, "Source must not be null");
        Assert.notNull(target, "Target must not be null");
        Class<?> actualEditable = target.getClass();
        PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);
        PropertyDescriptor[] var4 = targetPds;
        int var5 = targetPds.length;

        for(int var6 = 0; var6 < var5; ++var6) {
            PropertyDescriptor targetPd = var4[var6];
            if (targetPd.getWriteMethod() != null) {
                PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
                if (sourcePd != null && sourcePd.getReadMethod() != null) {
                    try {
                        Method readMethod = sourcePd.getReadMethod();
                        if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
                            readMethod.setAccessible(true);
                        }

                        Object srcValue = readMethod.invoke(source);
                        if (sourcePd.getPropertyType().isEnum() || targetPd.getPropertyType().isEnum()) {
                            srcValue = null;
                        }

                        if (srcValue != null) {
                            Object value = srcValue;
                            if (sourcePd.getPropertyType().isAssignableFrom(Double.class) && targetPd.getPropertyType().isAssignableFrom(BigDecimal.class)) {
                                value = new BigDecimal((Double)srcValue);
                            }

                            if (sourcePd.getPropertyType().isAssignableFrom(BigDecimal.class) && targetPd.getPropertyType().isAssignableFrom(Double.class)) {
                                value = ((BigDecimal)srcValue).doubleValue();
                            }

                            if (sourcePd.getPropertyType().isAssignableFrom(Long.class) && targetPd.getPropertyType().isAssignableFrom(BigDecimal.class)) {
                                value = new BigDecimal((Long)srcValue);
                            }

                            if (sourcePd.getPropertyType().isAssignableFrom(BigDecimal.class) && targetPd.getPropertyType().isAssignableFrom(Long.class)) {
                                value = ((BigDecimal)srcValue).longValue();
                            }

                            if (sourcePd.getPropertyType().isAssignableFrom(String.class) && targetPd.getPropertyType().isAssignableFrom(BigDecimal.class)) {
                                String srcValueStr = (String)srcValue;
                                if (srcValueStr.matches("^(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){2})$")) {
                                    value = new BigDecimal((String)srcValue);
                                }
                            }

                            if (sourcePd.getPropertyType().isAssignableFrom(BigDecimal.class) && targetPd.getPropertyType().isAssignableFrom(String.class)) {
                                value = MathUtil.roundTwoScale((BigDecimal)srcValue).toString();
                            }

                            if (value != null) {
                                Method writeMethod = targetPd.getWriteMethod();
                                if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
                                    writeMethod.setAccessible(true);
                                }

                                writeMethod.invoke(target, value);
                            }
                        }
                    } catch (Throwable var13) {
                        throw new FatalBeanException("Could not copy properties from source to target", var13);
                    }
                }
            }
        }

    }
}

 

使用示例

 

	//伪代码---对象1烤贝属性字段(包括refrence类型深拷贝)至对象2
    Object1 object1 = new Object1("name");
    Object1 object2 = new Object2();
    EnhanceBeanUtil.copyProperties(object1, object2);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java_爱吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值