常见的BeanUtils.copyProperties的坑

一、常见问题

1、类型不一致

@Data
public class TestMapperStruct{
    private Integer age;
}
@Data
public class TestMapperStructDto {
    private String age;
}

执行结果:

2、浅拷贝

  • 浅拷贝是创建一个新对象,这个对象的属性值与原始对象相同,但对于引用类型的属性,仍然共享相同的引用。浅拷贝只复制对象及其引用,而不复制引用指向的对象本身。

  • 深拷贝是创建一个新对象,这个对象的属性值与原始对象相同,包括引用类型的属性。深拷贝会递归复制引用对象,创建全新的对象,以确保拷贝后的对象与原始对象完全独立

@Data
public class Test {
   private String locationCode;
   private Test1 test1;
   
}
@Data
public class Test1 {
    private String locationCode;
    private String locationName;

}

测试用例:

执行结果:

3、属性名不一致

@Data
public class TestMapperStruct{
    private String age1;
}
@Data
public class TestMapperStructDto {
    private String age;
}

测试用例:

执行结果:

4、null值覆盖

@Data
public class TestMapperStruct{
    private String age;
}
@Data
public class TestMapperStructDto {
    private String age;
}

测试用例:

执行结果:

5、boolean类型加+is属性开头的坑

@Data
public class TestMapperStruct{
    private Boolean isDeleted;
}
@Data
public class TestMapperStructDto {
    private boolean isDeleted;
}

测试用例:

按理说Boolean 和boolean是拆装箱的关系应该可以赋值上

执行结果:

下面把is去掉

@Data
public class TestMapperStruct{
    private Boolean deleted;
}
@Data
public class TestMapperStructDto {
    private boolean deleted;
}

测试用例

执行结果:

这回执行正确了 

ps:如果两个实体类都是Boolean+is开头执行结果也会是正确的

执行结果:

6、不同内部类属性值相同赋值失败

@Data
public class TestMapperStruct{
    private User user;
    @Data
    public static class User{
        private String name;
        private Integer age;
    }
}
@Data
public class TestMapperStructDto {
    private User user;
    @Data
    public static class User{
        private String name;
        private Integer age;
    }
}

测试用例:

执行结果:

如果换成hutool的BeanUtil.copyProperties就可以成功,上代码

执行结果:

7、没有赋值set、get方法

@Data
public class TestMapperStruct{
    private String locationCode;
    
}
@Getter
@ToString
public class TestMapperStructDto {
    private String locationCode;
}

测试用例:

执行结果:

8、性能问题

执行时间:

改成set方式

执行时间:

所以

BeanUtils.copyProperties性能比较低

二、推荐使用mapstruct

引入pom

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.3.Final</version>
</dependency>

1、demo

测试代码

处理时间:

建议实体类转换用mapstruct不仅速度快而且提供了丰富的api

BeanUtils用反射,是在运行阶段相对来说比get、set方法慢、MapStruct在编译阶段生产get、set方法,就跟我们自己写get、set一样,基本不消耗性能;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值