对一个类进行深拷贝

开发中可能遇到基于一条数据去生成多条数据,生成过程中修改部分属性值之后插入到数据库中,自己去new一个新对象去给属性赋值对于字段对的类会非常繁琐,通常我们会使用一些对象复制工具进行操作,例如spring的beanUtils,但这些工具对与对象类型的数据大多都是浅拷贝,拷贝的是java中的“引用”,不符合我们的预期。

在Java中,深拷贝意味着创建一个新的对象,并复制原始对象的所有字段到新对象,包括引用类型的字段。这样,如果原始对象的字段被修改,不会影响到新的对象。

实现深拷贝的一种常见方法是通过实现Cloneable接口并重写clone方法。但是,这种方法有一些缺点,例如需要手动处理所有字段,对于复杂的对象结构可能会很麻烦。

另一种更简单的方法是通过序列化和反序列化来实现深拷贝。这种方法的前提是你的类以及所有的字段都实现了Serializable接口。以下是一个示例:

  /**
   * deepCopy.
   */
  public static <T> T deepCopy(Object object, Class<T> cls) {
    try {
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(bos);
      oos.writeObject(object);
      oos.flush();
      oos.close();
      bos.close();
      ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
      ObjectInputStream ois = new ObjectInputStream(bis);
      return (T) ois.readObject();
    } catch (IOException | ClassNotFoundException e) {
      LOG.error(e, "deepCopy error");
      return null;
    }
  }

  public static void main(String[] args) {
    GeneralRule generalRule = new GeneralRule();
    generalRule.setSellerId(123L);
    GeneralRule deepCopyGeneralRule = deepCopy(generalRule, GeneralRule.class);
    System.out.println(deepCopyGeneralRule);
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值