知识大全 JAVA 深层拷贝 DeepCopy的使用详解
Posted 知
篇首语:知识比金钱宝贵,比刀剑锋利,比枪炮威力大。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JAVA 深层拷贝 DeepCopy的使用详解相关的知识,希望对你有一定的参考价值。
JAVA 深层拷贝 DeepCopy的使用详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
最近需要用到比较两个对象属性的变化 其中一个是oldObj 另外一个是newObj oldObj是newObj的前一个状态 所以需要在newObj的某个状态时 复制一个一样的对象 由于JAVA不支持深层拷贝 因此专门写了一个方法方法实现很简单 提供两种方式 一种是序列化成数据流 前提是所有对象(对象中包含的对象 )都需要继承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 e ) //这里报错不需要处理 /** * 是否可以使用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()); cha138/Article/program/Java/JSP/201311/20101相关参考
如何实现文件夹对文件夹的拷贝呢?如果文件夹里还有文件夹怎么办呢? 接下来我就将我的方法演示给一些初学者希望能够帮助你们! /* *CopyRightby */ packageco
JavaSocket共享的设计原理深层透析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Jav
知识大全 Java Reflection (JAVA反射)详解
JavaReflection(JAVA反射)详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java技巧:拷贝枚举器以加强效率 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 当一个代码段正
java中Class对象详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中把生成Cl
Java对各种文件的操作详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中提供了io
Java中的finalize详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 程序员都了解初始
Java输入输出流详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! stream代表的是任何有
Java正则表达式详解(中) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 三应用实例
Java正则表达式详解(下) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! HTML处理实例二