深度复制

项目研发过程中,会遇到实体转换实体、线程取实体、实体先查再改再引用,出现各类问题(实体工作空间根一致)。

现将遇到过的深度复制写法分享:

1、List深度复制

/**
 * List深复制
 */
public static <T> List<T> listCopy(List<T> src) throws IOException, ClassNotFoundException {
    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(byteOut);
    out.writeObject(src);

    ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
    ObjectInputStream in = new ObjectInputStream(byteIn);
    @SuppressWarnings("unchecked")
    List<T> dest = (List<T>) in.readObject();
    return dest;
}

2、对象深度复制

/**
   *  
   * 对象深度复制
   */
   public static Object cloneObjBySerialization(Serializable src) throws MyException {
   Object dest = null;
   try (ByteArrayOutputStream bos =new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)){
      oos.writeObject(src);
      oos.flush();
      byte[] bytes = bos.toByteArray();
      try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))){
         dest = ois.readObject();
      }
      return dest;
   } catch (Exception e) {
      //克隆失败
      logger.error("[cloneObjBySerialization.method Error from xxxxxx.class]-对象深克隆异常,{}",e);
   }
   
}

3、对象复制

/**
 *
 * @param source 被复制的实体类对象
 * @param to 复制完后的实体类对象
 * @throws Exception
 */
public static void copyObjectToObject(Object source, Object to) throws MyException {
    try {
        // 获取属性
        BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass(),java.lang.Object.class);
        PropertyDescriptor[] sourceProperties = sourceBean.getPropertyDescriptors();

        BeanInfo destBean = Introspector.getBeanInfo(to.getClass(),java.lang.Object.class);
        PropertyDescriptor[] destProperties = destBean.getPropertyDescriptors();
        for (int i = 0; i < sourceProperties.length; i++) {

            for (int j = 0; j < destProperties.length; j++) {
                PropertyDescriptor sourceProperty = sourceProperties[i];
                PropertyDescriptor destProperty = destProperties[j];
                if (sourceProperty.getName().equals(destProperty.getName())&&sourceProperty.getPropertyType()==destProperty.getPropertyType()) {
                    // 调用source的getter方法和dest的setter方法
                    destProperties[j].getWriteMethod().invoke(to,sourceProperties[i].getReadMethod().invoke(source));
                    break;
                }
            }
        }
    } catch (Exception e) {
        logger.error("[copyObjectToObject Error from xxxxxx.class]-对象复制异常,{}",e); 
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值