版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang_xiaomeng/article/details/83660301
前几天遇到一个需求,需要将java对象复制下,但是总是复制的引用。而不是只复制对象的属性值。如果对象还包含另一个对象。就更麻烦了。
package com.sunlands.community.common.entity;
import java.io.*;
public class TestDTO implements Serializable {
private static final long serialVersionUID = 1L;
private String field1;
private String field2;
private InnerDTO innerDTO;
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public InnerDTO getInnerDTO() {
return innerDTO;
}
public void setInnerDTO(InnerDTO innerDTO) {
this.innerDTO = innerDTO;
}
public Object deepClone() throws IOException, OptionalDataException,
ClassNotFoundException {
// 将对象写到流里
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
// 从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
}
package com.sunlands.community.common.entity;
import java.io.*;
/**
* Created by 67534 on 2018/11/2.
*/
public class InnerDTO implements Serializable {
private static final long serialVersionUID = 1L;
private String data1;
private String data2;
public String getData1() {
return data1;
}
public void setData1(String data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
public Object deepClone() throws IOException, OptionalDataException,
ClassNotFoundException {
// 将对象写到流里
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
// 从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
}
深拷贝执行代码:
TestDTO testDto = new TestDTO();
TestDTO testDtoTemp= (TestDTO)testDto.deepClone();
对象包含的类也需要实现deepClone方法