利用序列化和反序列化实现深度克隆,直接上代码:
package clone;import java.io.Serializable;
/**
* 要实现Serializable
* @author Jack
*
*/
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = -5007319993510922716L;
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package clone;
import java.io.Serializable;
import java.util.List;
/**
* 要实现Serializable
* @author Jack
*
*/
public class MySystem implements Serializable{
/**
*
*/
private static final long serialVersionUID = 5750212768684906174L;
private int id;
private String name;
private User user;
private List<User> users;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
package clone;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 注意的是我们需要将需要克隆的类都要实现Serializable
* @author Jack
*
*/
public class BeanUtils {
public static <T> T cloneTo(T t){
T dist = null;
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
ObjectOutputStream objOutStream = null;
ObjectInputStream objInStream = null;
try {
objOutStream = new ObjectOutputStream(byteStream);
objOutStream.writeObject(t);
objOutStream.flush();
objInStream = new ObjectInputStream(new ByteArrayInputStream(byteStream.toByteArray()));
dist = (T) objInStream.readObject();
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
if (objOutStream != null){
try {
objOutStream.close();
objOutStream = null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (objInStream != null){
try {
objInStream.close();
objInStream = null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
return dist;
}
public static void main(String[] args) {
/**
* 单个对象的克隆
*/
User user = new User();
user.setId(2);
user.setAge(22);
user.setName("jack");
User user1 = cloneTo(user);
user1.setAge(33);
System.out.println(user.getAge()); //22
System.out.println(user1.getAge()); //33
/**
* 深度克隆(Mysystem中有User这个属性)
*/
MySystem system = new MySystem();
system.setId(1);
system.setName("这是一个系统");
system.setUser(user);
MySystem system1 = cloneTo(system);
system1.setName("这还是我的系统");
System.out.println(system.getName()); //这是一个系统
System.out.println(system1.getName()); //这还是我的系统
/**
* 深度克隆之集合的深度克隆
*/
User userMain = new User();
user.setId(2);
user.setAge(22);
user.setName("jackMain");
User userBranch = new User();
userBranch.setId(2);
userBranch.setAge(22);
userBranch.setName("jackBranch");
MySystem systemMain = new MySystem();
systemMain.setName("这还是我的系统Main");
List<User> users = new ArrayList<>();
users.add(userMain);
systemMain.setUsers(users);
MySystem systemBranch = cloneTo(systemMain);
systemBranch.setName("这还是我的系统Branch");
systemBranch.getUsers().add(userBranch);
System.out.println(systemMain.getName()+":"+systemMain.getUsers().size()); //1
System.out.println(systemBranch.getName()+":"+systemBranch.getUsers().size());//2
}
}
可直接运行该代码