实现Cloneable接口就具备拷贝能力,但是只是浅拷贝,对于对象只是拷贝了对象实例的一个地址。原有对象和拷贝对象共享该实例变量。故特地使用序列化实现提供拷贝工具类。
序列化拷贝工具类
class CloneUtils{
// 拷贝一个对象
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj){
// 拷贝产生的对象
T clonedObj = null;
try {
// 读取对象字节数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();
// 分配内存空间,写入原始对象,生成新对象
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
// 返回新对象,并做类型转换
clonedObj = (T)ois.readObject();
ois.close();
}catch (Exception e){
e.printStackTrace();
}
return clonedObj;
}
}
注意
- 被拷贝的类需要实现Serializable接口,并添加serialVersionUID。