开发中可能遇到基于一条数据去生成多条数据,生成过程中修改部分属性值之后插入到数据库中,自己去new一个新对象去给属性赋值对于字段对的类会非常繁琐,通常我们会使用一些对象复制工具进行操作,例如spring的beanUtils,但这些工具对与对象类型的数据大多都是浅拷贝,拷贝的是java中的“引用”,不符合我们的预期。
在Java中,深拷贝意味着创建一个新的对象,并复制原始对象的所有字段到新对象,包括引用类型的字段。这样,如果原始对象的字段被修改,不会影响到新的对象。
实现深拷贝的一种常见方法是通过实现Cloneable接口并重写clone方法。但是,这种方法有一些缺点,例如需要手动处理所有字段,对于复杂的对象结构可能会很麻烦。
另一种更简单的方法是通过序列化和反序列化来实现深拷贝。这种方法的前提是你的类以及所有的字段都实现了Serializable接口。以下是一个示例:
/**
* deepCopy.
*/
public static <T> T deepCopy(Object object, Class<T> cls) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(object);
oos.flush();
oos.close();
bos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (T) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
LOG.error(e, "deepCopy error");
return null;
}
}
public static void main(String[] args) {
GeneralRule generalRule = new GeneralRule();
generalRule.setSellerId(123L);
GeneralRule deepCopyGeneralRule = deepCopy(generalRule, GeneralRule.class);
System.out.println(deepCopyGeneralRule);
}