深递归拷贝

    public static <T> void copyPropertiesDoDeepCopy(T source, T target) {
        if (source == null) {
            throw DasException.internalError(null, "Internal_error");
        }
        if (target == null) {
            throw DasException.internalError(null, "Internal_error");
        }
        try {

            if (source instanceof Collection) {
                if (source instanceof List) {
                    List invokeSouceClassInstance = (List) source;
                    List invokeTargeClassInstance = (List) target;
                    for (Object invokeSouceTypeListItem : invokeSouceClassInstance) {
                        Object invokeTargeTypeListItem = invokeSouceTypeListItem.getClass().newInstance();
                        copyPropertiesDoDeepCopy(invokeSouceTypeListItem, invokeTargeTypeListItem);
                        invokeTargeClassInstance.add(invokeTargeTypeListItem);
                    }
                }
            } else if (source instanceof Array) {

            } else {
                BeanInfo beanInfoSource = Introspector.getBeanInfo(source.getClass());

                PropertyDescriptor[] propertyDescriptorsSource = beanInfoSource.getPropertyDescriptors();

                for (PropertyDescriptor propertyDescriptorSource : propertyDescriptorsSource) {
                    Method readMethod = propertyDescriptorSource.getReadMethod();
                    Object invokeSouce = readMethod.invoke(source);
                    if (invokeSouce instanceof Class) {
                        continue;
                    }
                    if (null == invokeSouce) {
                        continue;
                    }
                    if (invokeSouce instanceof Number) {
                        if (invokeSouce instanceof Double) {
                            Double invokeTarget = new Double((Double) invokeSouce);

                            PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                            Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                            writeMethodTarget.invoke(target, invokeTarget);
                        } else if (invokeSouce instanceof Float) {
                            Float invokeTarget = new Float((Float) invokeSouce);

                            PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                            Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                            writeMethodTarget.invoke(target, invokeTarget);
                        } else if (invokeSouce instanceof Long) {
                            Long invokeTarget = new Long((Long) invokeSouce);

                            PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                            Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                            writeMethodTarget.invoke(target, invokeTarget);
                        } else if (invokeSouce instanceof Integer) {
                            Integer invokeTarget = new Integer((Integer) invokeSouce);

                            PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                            Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                            writeMethodTarget.invoke(target, invokeTarget);
                        } else if (invokeSouce instanceof Short) {
                            Short invokeTarget = new Short((Short) invokeSouce);

                            PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                            Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                            writeMethodTarget.invoke(target, invokeTarget);
                        } else if (invokeSouce instanceof Byte) {
                            Byte invokeTarget = new Byte((Byte) invokeSouce);

                            PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                            Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                            writeMethodTarget.invoke(target, invokeTarget);
                        }
                    } else if (invokeSouce instanceof String) {
                        String invokeTarget = (String) invokeSouce;

                        PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                        Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                        writeMethodTarget.invoke(target, invokeTarget);
                    } else if (invokeSouce instanceof Boolean) {
                        // 布尔类型
                        Boolean invokeTarget = (Boolean) invokeSouce;

                        PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                        Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                        writeMethodTarget.invoke(target, invokeTarget);
                    } else if (invokeSouce instanceof Date) {
                        // 日期类型
                        Date invokeTarget = new Date(((Date) invokeSouce).getTime());

                        PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                        Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                        writeMethodTarget.invoke(target, invokeTarget);
                    } else if (invokeSouce instanceof Collection) {
                        if (invokeSouce instanceof List) {
                            List invokeSouceType = (List) invokeSouce;
                            List invokeTargeType = new LinkedList();
                            for (Object invokeSouceTypeListItem : invokeSouceType) {
                                Object invokeTargeTypeListItem = invokeSouceTypeListItem.getClass().newInstance();
                                copyPropertiesDoDeepCopy(invokeSouceTypeListItem, invokeTargeTypeListItem);
                                invokeTargeType.add(invokeTargeTypeListItem);
                            }

                            PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                            Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                            writeMethodTarget.invoke(target, invokeTargeType);
                        }
                    } else if (invokeSouce instanceof Map) {
                        Map invokeSouceType = (Map) invokeSouce;
                        Map invokeTargeType = (Map) invokeSouce.getClass().newInstance();
                        for (Object entry : invokeSouceType.entrySet()) {
                            Map.Entry<Object, Object> mapEntry = (Map.Entry<Object, Object>) entry;
                            Object invokeTargeTypeMapValue = mapEntry.getValue().getClass().newInstance();
                            copyPropertiesDoDeepCopy(mapEntry.getValue(), invokeTargeTypeMapValue);
                            invokeTargeType.put(mapEntry.getKey(), invokeTargeTypeMapValue);
                        }

                        PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                        Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                        writeMethodTarget.invoke(target, invokeTargeType);
                    } else if (invokeSouce instanceof Enum) {
                        // 枚举类型
                        Enum invokeTarget = (Enum) invokeSouce;

                        PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                        Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                        writeMethodTarget.invoke(target, invokeTarget);
                    } else {
                        Object invokeTarget = invokeSouce.getClass().newInstance();
                        copyPropertiesDoDeepCopy(invokeSouce, invokeTarget);

                        PropertyDescriptor propertyDescriptorTarget = new PropertyDescriptor(propertyDescriptorSource.getName(), target.getClass());
                        Method writeMethodTarget = propertyDescriptorTarget.getWriteMethod();
                        writeMethodTarget.invoke(target, invokeTarget);
                    }
                }
            }
        } catch (Exception e) {
            throw DasException.internalError(e, "Internal_error");
        }
    }

BUG:

writeMethodTarget.invoke(target, invokeTarget);

Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class

解决方案:writeMethodTarget 和 target必须是一一对应的对象实例和方法。通过propertyDescriptor获得的WriteMethod需要与invoke方法的第一个参数保持一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值