一种是序列化成数据流,前提是所有对象(对象中包含的对象...)都需要继承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方法就行。
更多java 深层拷贝 deepcopy的使用详解。
