在开发过程中,可能会遇到我们需要一个和某个对象一样数据,但是不是同一个内存地址的新对象,这个时候就需要用到Clone()了.
不过.注意,Clone()分为浅拷贝和深拷贝.区别在于要拷贝的对象是否有非基本变量.
1.如果一个对象是这样的:
1 public class CloneMan { 2 /** 3 * @fields id 克隆人id 4 */ 5 private int id; 6 /** 7 * @fields isM 克隆人性别 8 */ 9 private boolean isM; 10 11 public CloneMan(int id, boolean isM) { 12 this.id = id; 13 this.isM = isM; 14 } 15 16 public int getId() { 17 return id; 18 } 19 public void setId(int id) { 20 this.id = id; 21 } 22 public boolean isM() { 23 return isM; 24 } 25 public void setM(boolean isM) { 26 this.isM = isM; 27 } 28 }
CloneMan类只有基本变量类型的成员变量,那么Clone一个,只需要实现Cloneable接口,重写Clone()方法即可
1 public class CloneMan implements Cloneable{ 2 /** 3 * @fields id 克隆人id 4 */ 5 private int id; 6 /** 7 * @fields isM 克隆人性别 8 */ 9 private boolean isM; 10 11 public CloneMan(int id, boolean isM) { 12 this.id = id; 13 this.isM = isM; 14 } 15 16 public int getId() { 17 return id; 18 } 19 public void setId(int id) { 20 this.id = id; 21 } 22 public boolean isM() { 23 return isM; 24 } 25 public void setM(boolean isM) { 26 this.isM = isM; 27 } 28 29 public CloneMan clone() { 30 try { 31 return (CloneMan)super.clone(); 32 } catch (CloneNotSupportedException e) { 33 e.printStackTrace(); 34 return null; 35 } 36 } 37 }
通过clone()方法就可以获取到新的CloneMan对象.
但是,如果需要克隆的类的成员变量包括了非基本类型的,如String,那么这种方法就失效了.因为里面的非基本变量类型也需要重写clone()方法,这种方式我觉得太麻烦了.
通过查找资料,我知道一个通过IO流来clone对象的方法,亲测有效
public static Object deepClone(Object obj) { //将对象写入流中 ByteArrayOutputStream bo = new ByteArrayOutputStream(); try { ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(obj); //将对象从流中读出来 ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return oi.readObject(); } catch (IOException e) { e.printStackTrace(); return null; } catch (ClassNotFoundException e) { e.printStackTrace(); return null; } }
###注意:这里传入的Object要实现可序列化接口Serializable###
这里得到的是一个Object对象,可以在获取后进行强转获取到想要的类型,我这里处理的是如果有异常返回的是null,所以获取后要进行一次非空判断.
因为这个是一个通用方法,可以卸载IOUtil中公用
时间: 2024-10-08 10:28:51