自定义工具类实现深拷贝
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);