java对象深拷贝(Mapstruct)代码实现

这几天写的需求正在提测中,所以比较有空闲时间,正好来总结一下开发中遇到的问题并记录一下。

在开发过程中遇到这样一个问题:多个对象实体间要进行对象拷贝,并且对象里面还包含别的对象集合,对象名字也不同,但是里面的字段是一样的,使用普通的方式拷贝,发现只是进行了浅拷贝,里面的对象没有拷贝到。最后使用MapStruct方法完美解决,主要原因:拷贝速度快,支持深拷贝。

本文只教简单实现深拷贝,如果想学习更深的知识就去官网查看。。

MapStruct官网:https://mapstruct.org/

使用方法:

1.新建XXMapper,接口或抽象类 (比如:UserMapper)

2.加上注解 @Mapper (注意引入的import包:org.mapstruct.xxxx)

3.创建转换方法 (如下图代码方法userToUserVO(User user))

4.在方法上添加@Mapping(source="源对象:这里就是是User中的属性",target = "目标对象:这里就是UserVO的属性")

        如下图,user.name 要转成 userVO.nikeName

5.若有多个属性不同,可用@Mappings

代码示例:

1、引入相关依赖:
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
</dependency>
2、写几个要映射的对象:
//返给前端的对象
public class UserVO {
    private Integer id;
    private String nickName;
    private Integer age;

    private List<DogVO> dogs;
}


public class DogVO {
    private String name;
    private String color;
}
//后端交互的对象
public class User {
    private Integer id;
    private String name;
    private Integer age;

    private List<Dog> dogList;
}


public class Dog {
    private String name;
    private String col;
}
3、定义一个映射器:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

/**
 * @author 
 * @description: 定义一个映射器
 * @version: 1.0
 */
@Mapper
public interface UserMapper {

    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    /**
     * User的映射
     */
    @Mappings({@Mapping(source = "dogList",target = "dogs"),@Mapping(source = "name",target = "nickName")})
    UserVO userToUserVO(User user);

    /**
     * Dog的映射
     */
    @Mapping(source = "col",target = "color")
    DogVO dogToDogVO(Dog dog);

}
4、测试代码:
 public static void main(String[] args) {
        ArrayList<Dog> dogs = new ArrayList<>();
        Dog dog = new Dog("小蓝","蓝色");
        Dog dog1 = new Dog("小黑","黑色");
        Dog dog2 = new Dog("小绿","绿色");
        dogs.add(dog2);
        dogs.add(dog1);
        dogs.add(dog);
        User user = new User();
        user.setId(1);
        user.setAge(18);
        user.setName("Test");
        user.setDogList(dogs);
        UserVO userVO = UserMapper.INSTANCE.userToUserVO(user);
        System.out.println(userVO.toString());
    }
5、输出结果:

下面是一个示例代码,用于实现 Java 中的对象深拷贝: ``` import java.io.*; public class MyClass implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private int myInt; private String myString; private MyObject myObject; public MyClass(int myInt, String myString, MyObject myObject) { this.myInt = myInt; this.myString = myString; this.myObject = myObject; } public Object clone() throws CloneNotSupportedException { MyClass newObj = (MyClass) super.clone(); newObj.myObject = (MyObject) myObject.clone(); return newObj; } public MyClass deepCopy() throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (MyClass) ois.readObject(); } } class MyObject implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private int myInt; private String myString; public MyObject(int myInt, String myString) { this.myInt = myInt; this.myString = myString; } public Object clone() throws CloneNotSupportedException { return super.clone(); } } ``` 以上代码中,MyClass 类和 MyObject 类都实现了 Cloneable 接口,并重写了 clone() 方法。在 MyClass 类的 clone() 方法中,我们通过调用 super.clone() 方法首先创建了一个新的 MyClass 对象,然后将 myObject 属性也进行了深拷贝。在 MyClass 类的 deepCopy() 方法中,我们使用了序列化和反序列化的方式,将对象序列化为字节流,再将字节流反序列化为对象,以此实现对象深拷贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值