前言

BeanUtils.copyProperties十有八九是你这些年工作中用的很多的其中一个,不管是Apache的还是Spring的。

网上的解释浩如烟海,我这边用一个超简单的例子直观展示给你看。

以后就记住了,能不用就不用。

正文

1、网上的解释

我收纳了几个网上最典型的解释,也就是这个工具类的缺点,可以先回顾一下。

大致如下:

1、只能浅拷贝,简单理解就是只复制的引用,没复制对象内容;

2、名称和类型要匹配,不匹配的属性会复制失败;

3、性能一般,因为用了反射机制。

这里面,其实对于我们来讲,这个工具好不好用,理解第2点就足够了。

2、名称不匹配

假设一个user对象,有个属性是手机号,那么我们看看使用BeanUtils后是什么效果。

这是原对象,定义联系方式是telePhone。

然后我们定义一个接收拷贝的对象

使用BeanUtils.copyProperties拷贝后效果如下:

可以看到,因为名称少了一个字母,所以拷贝后联系方式是null。

如果是返回给前端的接口数据,字段又多,这样的问题会耽误你不少时间。

3、类型不匹配

我们再换个测试方式,原对象有个age属性是String类型。

而接收拷贝的对象,因为你的同事偷懒,误以为不是String,就给个Integer类型。

看看效果,不会报错。

但是age也是null,没有复制成功。

4、如果遇到猪队友

其实上面两个就是典型的缺点了,那我们如果再极端点,假设你某天遇到了猪队友。

你们有一个类型是金额,原对象类型是BigDecimal。

而猪队友自己创建了一个VO,给你来个double类型,你觉得会报错吗?

假如这个金额传的还挺大

看下效果

玛德,直接钱没了,你完了。

5、我怎么用的

工作这么多年,上面的坑我基本都踩过,有些是我踩别人的。

所以我挺早就开始像下面这么用了,返璞归真了。

没错,直接用IDEA的插件自动生成setter,然后写值。

什么BeanUtils,什么MapStruct,什么ModelMapper,都再见!

灵活,可控,直观,性能还好,字段多也多不到哪里去,中小企业的最佳选择。

总结

我所在的互联网公司,从前年开始就已经禁止使用BeanUtils.copyProperties了,因为坑了太多队友。

有段时间也有项目用MapStruct,但是当映射变得复杂时,配置也相应复杂起来,而且错误信息有时会不清晰。

所以最终我们还是返璞归真了,用插件简化映射,人工赋值,降低维护难度,已被列入了公司的编程规范。

君子,不立于危墙之下,看得见摸得着的心里才踏实。


喜欢就点赞关注↓↓↓,更多干货持续输出。

BeanUtils.copyProperties:曾经是我的女神,现在是我的毒药。的更多相关文章

  1. BeanUtils.copyProperties()方法和PropertyUtils.copyProperties()的区别

    首先两者来源于同一个包: import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.Prop ...

  2. BeanUtils.copyProperties() 用法

    BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处 ...

  3. java 使用BeanUtils.copyProperties(Object source,Object target) 复制字段值

    BeanUtils.copyProperties(person, wsPerson);把person的字段值,复制给wsPerson // 只复制两个实体中,字段名称一样的 很有用的一个功能...

  4. BeanUtils.copyProperties() 用法--部分转

    把一个类对象copy到另一个类对象(这两个可以不同). 1.org.apache.commons.beanutils.BeanUtils.copyProperties(dest, src) org.s ...

  5. BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别

    一.简介: BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean 通常包含了大量的属性,很多情况下,对Jav ...

  6. BeanUtils.copyProperties()方法引入不同包

    两个对象之间拷贝相同的属性,可以使用BeanUtils.copyProperties()方法, BeanUtils.copyProperties(obj1,obj2); 提示有三个包可选. A,选择o ...

  7. BeanUtils.copyProperties VS PropertyUtils.copyProperties

    作为两个bean属性copy的工具类,他们被广泛使用,同时也很容易误用,给人造成困然:比如:昨天发现同事在使用BeanUtils.copyProperties copy有integer类型属性的bea ...

  8. 小知识点BeanUtils.copyProperties

     通过BeanUtils.copyProperties可以时间拷贝对象中的值,下面的new String[]{"cid","agreeFlag"," ...

  9. BeanUtils.copyProperties缓解代码压力,释放双手

    简单描述:之前在写代码的时候,经常把表单提交到后台的对象的参数,通过getter方法取出来,然后,再通过setter方法传递给需要的对象,代码中写了很多get set这种方法,后来听同事说,sprin ...

  10. BeanUtils.copyProperties的简单示例

    一.新建测试实体 1.UserA package com.dechy.hebswj.test; public class UserA { private String a; private Strin ...

随机推荐

  1. js 字符串格式数组转为数组对象

    工作中经常会遇到将json字符串转换为json对象,但是将字符串格式数组转为数组对象的场景却不多 如: 其中label_exp: "["cap_pop","wk ...

  2. 密码暴力破解工具——九头蛇(hydra)使用详解及实战

    转载出处:https://zhuanlan.zhihu.com/p/540998739 二.使用方法 语法:Hydra 参数 IP 服务 参数: -l login 小写,指定用户名进行破解 -L fi ...

  3. web自动化04-css定位

    css元素定位 1. 是什么? 用来描述html元素的显示样式 选择器是一种模式,用于选择需要添加样式的元素   selenium中推荐使用css定位,比XPath定位要快    2.如何定位?   ...

  4. OCR -- 文本检测

    目录 目标检测: 文本检测: 检测难点: 检测方法: 基于回归的文本检测 水平文本检测 任意角度文本检测 弯曲文本检测 基于分割的文本检测 代码示例 可视化文本检测预测 DB文本检测模型构建 back ...

  5. Java实现猜拳小游戏

    Java实现猜拳游戏的核心在于电脑随机数的生成,Java中的随机数生成方法是:首先引入包   import java.util.*;  然后   int r=new Random().nextInt( ...

  6. liunx操作系统下配置服务器

    centos7 下配置服务器基本步骤 1,yum install  服务器名称 2,关闭防火墙,配置服务器配置文件,开启服务, 3,创建文件,设置访问权限, 4,本地登陆,测试服务器能否连通

  7. 在 RedHat 使用 gdc-client 下载 TCGA 数据

    今天,只聊一下 RedHat/CentOS 下 gdc-client 安装的那些事. gdc-client,官网地址:https://gdc.cancer.gov/access-data/gdc-da ...

  8. C++面试八股文:了解位运算吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第12面: 面试官:了解位运算吗? 二师兄:了解一些.(我很熟悉) 面试官:请列举以下有哪些位运算? 二师兄:按位与(&).按位或(|).按位 ...

  9. java中基本数据类型和包装数据类型

    基本数据类型和包装数据类型在 Java 中有着重要的区别和联系,对于 Java 程序员来说,熟悉这两种数据类型的特点和使用方法是非常必要的. 基本数据类型 Java 中的基本数据类型一共有 8 种,分 ...

  10. Aerospike架构设计与实现细节

    目录 1. 引言 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 2.3. 相关技术比较 3. 实现步骤与流程 3.1. 准备工作:环境配置与依赖安装 3.2. 核心模块实现 3 ...