/**
* 浅表复制对象
* @param value 原始对象
* @return 复制后的对象,只复制一层
* @throws IllegalAccessException
* @throws InstantiationException
* @throws InvocationTargetException
* @throws NoSuchMethodException
*/
public static Object clone(Object value) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException{
return clone(value,1);
}
/**
* 深度复制对象(通过Java反射+递归方式实现)
* @param value 原始对象
* @return 复制后的对象
* @throws IllegalAccessException
* @throws InstantiationException
* @throws InvocationTargetException
* @throws NoSuchMethodException
*/
public static Object deepClone(Object value) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException{
return clone(value,-1);
}
* 深度复制对象(采用序列化方式实现,推荐使用这种方法)
* @param obj 被复制对象
* @return 复制后的副本对象
*/
public static Object deepClone2(Object obj){
if(null == obj){
return null;
}
ByteArrayOutputStream bo = new ByteArrayOutputStream();
Object object = null;
try {
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(obj);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
object = oi.readObject();
} catch (OptionalDataException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
}
}
刚才说了,建议用序列化方式,还有一个重要的原因是,递归方式里用到了JDK util包里Arrays工具类里的copyOf方法,而该方法是JDK 1.6以上版本才有的,再个Arrays.copyOf内部实现其实也是调用System.arraycopy()方法来辅助实现的,查看System.arraycopy()方法的源代码,你会发现它被native关键字修饰,被native修饰即表名该方法是一个本地方法,那何为本地方法?也就是说该方法通过JNI技术调用了当前操作系统的DLL文件,这样你的程序就丧失了跨平台性,综合以上考虑,所以我建议采用序列化方式。
原文:java教程:再谈Java设计模式关于原型模式(Prototype)http://www.52ij.com/jishu/104.html