曾经面对想完全克隆出一个java对象出来。前面谈ArrayList的克隆问题,我记得当时我就傻傻的自己把被克隆对象的属性一一赋值到了一个新创建的对象中去。这真的是一件体力活啊。如果对象网络很复杂,所做的工作绝不会轻松哈。当时想到把对象图保存到文件中进行序列化。现在还找到一个不错的方法。直接使用管道流,将对象写入再读出,省却了序列化的步骤。找个时间来测验一下这两种方法,谁的效率更高。先把代码贴上:
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = -3432072860096318326L;
private String name;
private String password;
public Person(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
测试代码:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class TestClone {
/**
* @param args
*/
public static Object objectClone(Object originObj) {
PipedOutputStream op = new PipedOutputStream();
PipedInputStream ip = new PipedInputStream();
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
op.connect(ip);
oos = new ObjectOutputStream(op);
oos.writeObject(originObj);
ois = new ObjectInputStream(ip);
Object obj = ois.readObject();
return obj;
} catch (Exception e) {
System.out.println("exception");
return null;
} finally {
try {
op.close();
ip.close();
op = null;
ip = null;
if (oos != null) {
oos.close();
oos = null;
}
if (ois != null) {
ois.close();
ois = null;
}
} catch (IOException e) {
}
}
}
public static void main(String[] args) {
Person p1 = new Person("jianchen","123456");
System.out.println(p1);
Person p2 = (Person)objectClone(p1);
System.out.println(p2);
System.out.println(p2.getName()+" "+p2.getPassword());
}
}
输出如下:
Person@61de33
Person@60aeb0
jianchen 123456