项目研发过程中,会遇到实体转换实体、线程取实体、实体先查再改再引用,出现各类问题(实体工作空间根一致)。
现将遇到过的深度复制写法分享:
1、List深度复制
/**
* List深复制
*/
public static <T> List<T> listCopy(List<T> src) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List<T> dest = (List<T>) in.readObject();
return dest;
}
2、对象深度复制
/**
*
* 对象深度复制
*/
public static Object cloneObjBySerialization(Serializable src) throws MyException {
Object dest = null;
try (ByteArrayOutputStream bos =new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)){
oos.writeObject(src);
oos.flush();
byte[] bytes = bos.toByteArray();
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))){
dest = ois.readObject();
}
return dest;
} catch (Exception e) {
//克隆失败
logger.error("[cloneObjBySerialization.method Error from xxxxxx.class]-对象深克隆异常,{}",e);
}
}
3、对象复制
/**
*
* @param source 被复制的实体类对象
* @param to 复制完后的实体类对象
* @throws Exception
*/
public static void copyObjectToObject(Object source, Object to) throws MyException {
try {
// 获取属性
BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass(),java.lang.Object.class);
PropertyDescriptor[] sourceProperties = sourceBean.getPropertyDescriptors();
BeanInfo destBean = Introspector.getBeanInfo(to.getClass(),java.lang.Object.class);
PropertyDescriptor[] destProperties = destBean.getPropertyDescriptors();
for (int i = 0; i < sourceProperties.length; i++) {
for (int j = 0; j < destProperties.length; j++) {
PropertyDescriptor sourceProperty = sourceProperties[i];
PropertyDescriptor destProperty = destProperties[j];
if (sourceProperty.getName().equals(destProperty.getName())&&sourceProperty.getPropertyType()==destProperty.getPropertyType()) {
// 调用source的getter方法和dest的setter方法
destProperties[j].getWriteMethod().invoke(to,sourceProperties[i].getReadMethod().invoke(source));
break;
}
}
}
} catch (Exception e) {
logger.error("[copyObjectToObject Error from xxxxxx.class]-对象复制异常,{}",e);
}
}