源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

JAVA 深层拷贝 DeepCopy的使用详解

  • 时间:2021-11-19 17:38 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:JAVA 深层拷贝 DeepCopy的使用详解
[b]方法实现很简单,提供两种方式: [/b]一种是序列化成数据流,前提是所有对象(对象中包含的对象...)都需要继承Serializable接口,如果都继承了那很容易,如果没有继承,而且也不打算修改所有类,可以用第二种方式。 第二种是将对象序列化为json,通过json来实现拷贝,这种方式需要用到net.sf.json.JSONObject。 [b]具体代码如下: [/b]
[u]复制代码[/u] 代码如下:
    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方法就行。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部