Java 对象深拷贝工具类

当我们更新一个对象的时候,如果要记录对象属性的前后变化,那么在更新对象之前,我们应该首先将对象拷贝暂存起来,且这个时候的拷贝一定是深拷贝(内存地址不同的两个对象),因为Java存在对象引用,将一个对象赋值给另外一个对象,他是浅拷贝的(两个不同变量名,但实际内存地址一样的两个对象)的话,也就是说当我们去更新完成属性值的时候,其实是设置的同一个对象,那么这个时候就会导致更新前后无变化的情况。于是,搞一个对象拷贝工具类还是很有必要的。可以看到,批量属性复制也是OK的,拷贝后的集合中每个对象新生成的深拷贝对象。..
摘要由CSDN通过智能技术生成

目录

1. 使用场景

1.1 场景一

1.2 场景二

2. Spring 中的对象拷贝

3. 本工具类中的对象拷贝

3.1 拷贝对象本身(单个)

3.2 拷贝对象本身(批量)

3.3 拷贝对象属性至其他类(单个)

3.4 拷贝对象属性至其他类(批量)

4. 工具类源码


1. 使用场景

我们在Java编码中,有时候可能会经常遇到对象拷贝的场景。

1.1 场景一

当我们更新一个对象的时候,如果要记录对象属性的前后变化,那么在更新对象之前,我们应该首先将对象拷贝暂存起来,且这个时候的拷贝一定是深拷贝(内存地址不同的两个对象),因为Java存在对象引用,将一个对象赋值给另外一个对象,他是浅拷贝的(两个不同变量名,但实际内存地址一样的两个对象)的话,也就是说当我们去更新完成属性值的时候,其实是设置的同一个对象,那么这个时候就会导致更新前后无变化的情况。

1.2 场景二

又比如,当我们从数据库中查询出一个实体对象的时候,这个对象往往对应的是和数据库字段 一 一 对应的实体,但这个实体往往又不会满足我们的页面需求。比如我们查询学生课程表的时候,我们数据库往往只是存的一个 id 对应关系,但页面往往是展示的名称,那么这个名称字段我们的表对应的实体类是不应该存在的,这个时候,我们应该创建一个对应的 VO (View Object)类,把额外的需要字段定义在这里面,同时可以去继承原表实体类,这样的一个对象就满足了。到时候,我们把原表实体对应的字段值拷贝到 VO 对象中后,再设置其他表额外的字段,这样就可以返回给前端页面进行展示了。

综上:所以,对象拷贝还是挺有用途的,但如果我们拷贝对象的时候,去一个一个字段挨着进行取值拷贝的话,难免代码看上去不够优雅。于是,搞一个对象拷贝工具类还是很有必要的。

2. Spring 中的对象拷贝

其实,在Spring 中,也有类似的拷贝方法。他就是位于org.springframework.beans.BeanUtils 工具类中的copyProperties 方法。下面就简单演示下这个方法的使用效果。

为了方便演示,我们创建两个有部分相同属性的对象 Cat 类和 Dog 类(都有 name 和 age 字段)。

Cat 类如下:

@Data
public class Cat {

    private String name;
    private Integer age;
    private String color;

}

Dog 类如下:

@
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 我可以回答这个问题,以下是一个Java对象深拷贝的实现示例: ```java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class DeepCopyUtil { public static Object deepCopy(Object obj) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } } ``` 使用该工具类,可以对Java对象进行深拷贝。 ### 回答2: Java对象深拷贝工具类主要是用来创建一个完全独立的对象副本,其内部字段的值与原对象完全相同,但是在内存中是独立存在的,对副本的修改不会影响原对象。下面是一个简单的Java对象深拷贝工具类的实现: ```java import java.io.*; public class DeepCopyUtils { public static <T extends Serializable> T deepCopy(T object) { try { // 将对象写入流中 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(object); oos.close(); // 从流中读取对象 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); T copyObject = (T) ois.readObject(); ois.close(); return copyObject; } catch (Exception e) { e.printStackTrace(); return null; } } } ``` 上述工具类中的deepCopy方法接受一个泛型对象作为参数,并返回该对象深拷贝副本。实现过程利用了Java的序列化机制,即将对象写入输出流再从输入流读取出来,从而实现完全独立的副本。 需要注意的是,使用该深拷贝工具类对象必须实现Serializable接口,即可被序列化。另外,在实际应用中需要注意,被拷贝的对象的引用类型字段也必须实现Serializable接口,否则会抛出NotSerializableException异常。 使用该深拷贝工具类,可以轻松实现Java对象深拷贝,确保在进行对象拷贝的过程中保持原对象与拷贝对象的独立性。 ### 回答3: Java对象深拷贝即在拷贝一个对象时,创建一个新的对象,并且将原始对象中的所有属性值都复制到新对象中,而不是共享原始对象的属性值。为了实现Java对象深拷贝,可以使用以下的工具类: 1. 使用Java序列化:可以将对象序列化为字节流,然后再反序列化成一个新的对象。这个过程会创建一个全新的对象,所有属性都是独立的副本。下面是一个示例代码: ``` import java.io.*; public class DeepCopyUtil { public static Object deepCopy(Object object) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(object); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (Exception e) { e.printStackTrace(); return null; } } } ``` 2. 使用clone()方法:Java中的所有对象都继承了Object类,而Object类中有一个clone()方法,可以实现对象的浅拷贝。但是要实现深拷贝,需要在需要拷贝的对象中实现Cloneable接口,并重写clone()方法。在clone()方法中,可以对每个属性进行拷贝。下面是一个示例代码: ``` public class DeepCopyUtil { public static Object deepCopy(Object object) { try { if (object instanceof Cloneable) { Method cloneMethod = object.getClass().getDeclaredMethod("clone"); cloneMethod.setAccessible(true); return cloneMethod.invoke(object); } } catch (Exception e) { e.printStackTrace(); } return null; } } ``` 以上是两种常用的实现Java对象深拷贝工具类方式,可以根据实际需求选择适合的方法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值