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方法的第一个参数保持一致。