JAVA 深層拷貝 DeepCopy的應用詳解。本站提示廣大學習愛好者:(JAVA 深層拷貝 DeepCopy的應用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是JAVA 深層拷貝 DeepCopy的應用詳解正文
辦法完成很簡略,供給兩種方法:
一種是序列化成數據流,條件是一切對象(對象中包括的對象...)都須要繼續Serializable接口,假如都繼續了那很輕易,假如沒有繼續,並且也不盤算修正一切類,可以用第二種方法。
第二種是將對象序列化為json,經由過程json來完成拷貝,這類方法須要用到net.sf.json.JSONObject。
詳細代碼以下:
public class DeepCopy {
/**
* 深層拷貝
*
* @param <T>
* @param obj
* @return
* @throws Exception
*/
public static <T> T copy(T obj) throws Exception {
//能否完成了序列化接口,即便該類完成了,他具有的對象未必也有...
if(Serializable.class.isAssignableFrom(obj.getClass())){
//假如子類沒有繼續該接口,這一步會報錯
try {
return copyImplSerializable(obj);
} catch (Exception e) {
//這裡不處置,會運轉到上面的測驗考試json
}
}
//假如序列化掉敗,測驗考試json序列化方法
if(hasJson()){
try {
return copyByJson(obj);
} catch (Exception e) {
//這裡不處置,上面前往null
}
}
return null;
}
/**
* 深層拷貝 - 須要類繼續序列化接口
* @param <T>
* @param obj
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static <T> T copyImplSerializable(T obj) throws Exception {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
Object o = null;
//假如子類沒有繼續該接口,這一步會報錯
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
bais = new ByteArrayInputStream(baos.toByteArray());
ois = new ObjectInputStream(bais);
o = ois.readObject();
return (T) o;
} catch (Exception e) {
throw new Exception("對象中包括沒有繼續序列化的對象");
} finally{
try {
baos.close();
oos.close();
bais.close();
ois.close();
} catch (Exception e2) {
//這裡報錯不須要處置
}
}
}
/**
* 能否可使用json
* @return
*/
private static boolean hasJson(){
try {
Class.forName("net.sf.json.JSONObject");
return true;
} catch (Exception e) {
return false;
}
}
/**
* 深層拷貝 - 須要net.sf.json.JSONObject
* @param <T>
* @param obj
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static <T> T copyByJson(T obj) throws Exception {
return (T)JSONObject.toBean(JSONObject.fromObject(obj),obj.getClass());
}
}
只須要挪用copy辦法就行。