复制运行时的对象,克隆出一个一模一样的对象
实现方式 实现Cloneable接口创建克隆对象
package com.lglbc.protype.simple;
public class Student implements Cloneable{
private String name;
private String email;
private String address;
private Teacher teacher;
public Student(String name, String email, String address) {
this.name = name;
this.email = email;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
protected Student clone() {
try {
return (Student)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", email='" + email + ''' +
", address='" + address + ''' +
", teacher=" + teacher +
'}';
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
package com.lglbc.protype.simple;
public class Teacher implements Cloneable {
private String name;
public Teacher(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Teacher clone(){
try {
return (Teacher)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + ''' +
'}';
}
}
测试
package com.lglbc.protype.simple;
public class Test {
public static void main(String[] args) {
Student student = new Student("a", "b", "c");
student.setTeacher(new Teacher("张老师"));
System.out.println(student.toString());
Student cloneStudent = student.clone();
System.out.println(student.toString());
System.out.println(cloneStudent == student);
cloneStudent.getTeacher().setName("杨老师");
System.out.println(student.toString());
}
}
深度克隆
方式1
重写clone方法,依次调用成员变量的clone方法
package com.lglbc.protype.deep;
import java.io.Serializable;
public class Student implements Cloneable, Serializable {
private String name;
private String email;
private String address;
private Teacher teacher;
public Student(String name, String email, String address) {
this.name = name;
this.email = email;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
protected Student clone() {
try {
Student clone = (Student) super.clone();
Teacher teacher = clone.getTeacher().clone();
clone.setTeacher(teacher);
return clone;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", email='" + email + ''' +
", address='" + address + ''' +
", teacher=" + teacher +
'}';
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
方式2
通过序列化和反序列化实现
package com.lglbc.protype.deep.serializable;
import java.io.*;
public class Student implements Cloneable, Serializable {
private String name;
private String email;
private String address;
private Teacher teacher;
public Student(String name, String email, String address) {
this.name = name;
this.email = email;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
protected Student clone() {
ByteArrayOutputStream byteArrayOutputStream =null;
ObjectOutputStream objectOutputStream =null;
ByteArrayInputStream byteArrayInputStream =null;
ObjectInputStream objectInputStream =null;
try {
byteArrayOutputStream = new ByteArrayOutputStream();
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(this);
byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
objectInputStream = new ObjectInputStream(byteArrayInputStream);
Student student = (Student)objectInputStream.readObject();
return student;
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
byteArrayOutputStream.close();
byteArrayInputStream.close();
objectOutputStream.close();
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", email='" + email + ''' +
", address='" + address + ''' +
", teacher=" + teacher +
'}';
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
BeanUtils,MapStruct



