BeanUtils和BeanCopier拷贝对象对比

需求描述

在Java后端开发的时候,我们有时为了隔离变化,经常需要把数据库查询出来的实体转为返回前端的对象,我们不希望写很长的set方法去完成,于是可以考虑使用BeanUtils或BeanCopier工具类。下面通过Awards和AwardsResp类的转换简单说明下用法。

Awards类代码:

1
2
3
4
5
6
@Data
public class Awards {
private Long id;
private String topClass;
private List<AwardsDetail> detailList;
}

AwardsResp类代码:

1
2
3
4
5
6
@Data
public class AwardsResp {
private Long id;
private String topClass;
private List<AwardsDetailResp> detailList;
}

BeanUtils

BeanUtils 是org.springframework.beans下面的一个类。
简单用法如下:

1
2
AwardsResp resp = new AwardsResp();
BeanUtils.copyProperties(awards,resp);

copyProperties方法相关说明:

  • 不能复制属性名相同但是类型不同的属性(比如Long和Integer)
  • 不能复制list属性
  • 可以把map中的属性设置到对象中
    需要用org.apache.commons.beanutils包下面的类

BeanCopier

BeanCopier是org.springframework.cglib.beans包下面的一个类。
简单用法如下:

1
2
3
4
5
6
7
AwardsResp resp = new AwardsResp();
// 获取对象
// 第三个参数userConverter,是否开启Convert,默认BeanCopier只会做同名。对于属性名相同类型不同的需要自己写转换器
BeanCopier copier = BeanCopier.create(awards.getClass(), resp.getClass(), false);
// 开始复制
// 第三个参数也是转换器
copier.copy(awards, resp, null);

copy方法相关说明:

  • 默认不能复制属性名相同但是类型不同的属性(比如Long和Integer)。当然可以自己写转换器实现。
  • 可以"复制"list属性(只是把对象的引用指向改变了)
    比如复制后AwardsResp的detailList指向的是Awards的detailList对象地址,Awards的detailList是什么样最终返回的就是什么样,不受List中的类型影响。

Gson或者Fastjson实现对象拷贝

BeanUtils和BeanCopier都不真正支持复制list属性,用Gson或者Fastjson就可以实现。
Gson代码如下:

1
2
Gson gson = new Gson();
AwardsResp resq = gson.fromJson(gson.toJson(awards),AwardsResp.class);

参考链接