知识大全 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

相关参考

知识大全 利用java本地拷贝文件及文件夹

  如何实现文件夹对文件夹的拷贝呢?如果文件夹里还有文件夹怎么办呢?    接下来我就将我的方法演示给一些初学者希望能够帮助你们!    /*  *CopyRightby  */  packageco

知识大全 Java Socket共享的设计原理深层透析

JavaSocket共享的设计原理深层透析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Jav

知识大全 Java Reflection (JAVA反射)详解

JavaReflection(JAVA反射)详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 拷贝枚举器以加强效率

Java技巧:拷贝枚举器以加强效率  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当一个代码段正

知识大全 java中Class对象详解

java中Class对象详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  java中把生成Cl

知识大全 Java对各种文件的操作详解

Java对各种文件的操作详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  java中提供了io

知识大全 Java中的finalize详解

Java中的finalize详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  程序员都了解初始

知识大全 Java输入输出流详解

Java输入输出流详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  stream代表的是任何有

知识大全 Java正则表达式详解(中)

Java正则表达式详解(中)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    三应用实例   

知识大全 Java正则表达式详解(下)

Java正则表达式详解(下)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  HTML处理实例二