package cn.xx
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* <pre>
* @Types role : 测试clone
* @Create time : 2011-12-26 : 上午10:49:39
* @ver curr : 1.0
* </pre>
*/
public class TestClone implements Serializable{
private static final long serialVersionUID = -7340886443308126418L;
/**
* <pre>
* @Methods role : 对象的Clone
* 注: 要clone对象必须要实现Serializable接口, 不然抛NoSerializableException
* </pre>
* @param obj
* @return
* @throws IOException
* @throws ClassNotFoundException
* @Create time : 2011-12-23 : 下午5:26:57
* @ver curr : 1.0
*/
@SuppressWarnings("unchecked")
public static <T> T invokeCopy(T obj) throws IOException, ClassNotFoundException{
//T newObj = null;
// write object to memory
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
// read object come from memory
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
//newObj = (T)ois.readObject();
//bis.close();
//oos.close();
// return clone object
return (T)ois.readObject();
}
/**
* <pre>
* @Methods role : 实现对象的clone
* 两种方案(二选一实现都可以):
* 1: 实现Cloneable接口, 深度clone自己重写clone()实现,此方法只实现浅度clone
* 2: 实现Serializable接口
* @param obj
* @return
* @throws NoSuchMethodException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
* @throws ClassNotFoundException
* @throws IOException
* @throws CloneNotSupportedException
* @Create time : 2011-12-26 : 上午10:31:37
* @ver curr : 1.0
* </pre>
*/
public static<T> T clone(T obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, IOException, CloneNotSupportedException{
// is null
if(null == obj) return null;
// is instanceof Cloneable
if(obj instanceof Cloneable){
return invokeClone(obj);
}
// is instanceof Serializable
else if(obj instanceof Serializable){
return invokeCopy(obj);
}
// is not supported clone
throw new java.lang.CloneNotSupportedException();
}
@SuppressWarnings("unchecked")
public static <T> T invokeClone(T obj) throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
Class<? extends Object> classObject = obj.getClass();
Method method = classObject.getDeclaredMethod("clone");
return (T)method.invoke(obj);
}
public static void main(String[] args) throws ClassNotFoundException, IOException {
String x = "123";
String v = invokeCopy(x);
String[][] array = {{"1", "2"},{ "3", "2","2","3"},{"V","3"}}, array2;
System.out.println(x);
System.out.println(v);
array2 = invokeCopy(array);
System.out.println(Arrays.deepToString(array2));
int[] a = {1,48,2}, b = {1, 20, 19};
System.out.println("a --- hashCode: " + a.hashCode() + "---b: hashCode:" + b.hashCode());
b = invokeCopy(a);
System.out.println(b.hashCode());
System.out.println(Arrays.toString(b));
short age = 25;
Person p = new TestClone(). new Person(1l, "andy", age), ps, pe;
ps = invokeCopy(p);
System.out.println(ps);
try {
//pe = clone(p);
pe = invokeClone(p);
System.out.println(pe);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class Person implements Serializable{//, Cloneable{
private static final long serialVersionUID = 7605971168826706980L;
private Long id;
private String name;
private short age;
public Person() {
}
public Person(Long id, String name, short age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public short getAge() {
return age;
}
public void setAge(short age) {
this.age = age;
}
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
/*protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}*/
}
}