Java中BeanUtils.copyProperties基本用法与小坑
作者:凉拌海蜇丝 发布时间:2021-11-04 22:09:01
(1)实际应用
BeanUtils.copyProperties(赋值目标对象,模板源对象);
我们都知道当有两个对象AB,属性名称一样的情况下,如果需要把A的全部属性给B,传统写法是:
B.setXX(A.getXX());
如果只有几个特别的参数需要赋值过去这样写没问题,如果AB有100个参数需要粘过去,那么代码就太冗余太长了,BeanUtils.copyProperties就是为了解决这个问题的,现在假设有AB两个对象:
static class DemoA {
private String name;
private int sex;
private int phone;
}
static class DemoB {
private String name;
private int sex;
private int phone;
}
测试main方法:
public static void main(String[] args) throws Exception {
DemoA a = new DemoA();
DemoB b = new DemoB();
a.setName("jojo");
a.setPhone(12306);
a.setSex(1);
BeanUtils.copyProperties(b,a);
System.out.println("b: "+b.getName()+b.getPhone()+b.getSex());
}
(2) 使用要注意的小坑
1:如果AB都是或者有一个是static的,赋值都会失败
2:注意引入的包
import org.apache.commons.beanutils.BeanUtils;
之前手快引错了,死活拿不出来,浪费了一点时间Debug
如果用的是springframework的这个方法,记住复制对象和源对象位置是刚好相反。千万注意自己引入的哪个BeanUtil,写对应参数位置。
3:不提供get,set方法
public static void main(String[] args) throws Exception {
DemoA a = new DemoA("jojo",1,12306);
DemoB b = new DemoB();
BeanUtils.copyProperties(b,a);
System.out.println("b: "+b.toString());
}
赋值失败
为什么呢?因为,它底层是通过反射获取对象里面的每个属性,再通过get,set获取和设值,不提供get,set,就当然没办法复制了。
4:加@Data注解
我们知道lombok.Data包中的@Data注解可以帮助我们省去get,set方法,那么不写getset,加@Data行不行?
结果是可以的,我个人理解的注解的本质就是切面编程,把一些固定的逻辑通过增强型代理类配置进去,外部在使用的时候也就是使用增强型代理类的方法,而@Data类似一些省事的语法糖,帮助我们“写”了那堆get,set方法供别人调用。
5:参数名不一致的,不能复制成功
注意,参数名必须严格一致,例如:A.name 对应 B.name,如果是B.nAme或者B.names,那就肯定不行了!
如果刚好两个实体类参数名不一致,怎么办呢?那只能用老的写法B.setNames(A.getName());
(3)以springframework.beans的BeanUtils.copyProperties为例,快速看几眼源码,不难理解
第一个参数是源,第二个参数是目标对象
红色方法就是反射创建对象方法
来源:https://blog.csdn.net/whitebearclimb/article/details/118764546


猜你喜欢
- 本文实例讲述了Java简单工厂模式定义与用法。分享给大家供大家参考,具体如下:一 代码// 抽象产品(Abstract Product)角色
- 本文介绍了详解Android中PopupWindow在7.0后适配的解决,分享给大家,具体如下:这里主要记录一次踩坑的经历。需求:如上图左侧
- 在拿到一个 Stream 如何优雅将这个 Stream 保存到代码最优雅的方法应该是通过 CopyTo 或 CopyToAsync 的方法u
- 1. 为什么要使用线程池使用线程池通常由以下两个原因:频繁创建销毁线程需要消耗系统资源,使用线程池可以复用线程。使用线程池可以更容易管理线程
- 本文实例为大家分享了C#实现学生成绩管理系统的具体代码,供大家参考,具体内容如下C#作业 用循环结构/数组实现进入启动页面管理员身份登入用户
- public static void SortDicWithLinq(){ &nb
- 一、开发环境:1、windows 7 企业版2、IDEA 143、JDK 1.84、Maven 3.5.25、MariaDB6、SQLYog
- 背景:在android开发中,列表是经常会使用到的一个主要控件,列表中可以展示大量的数据,像订单、商品、通讯录、浏览记录或者关注列表等等。可
- 本文实例为大家分享了java动态模拟时钟的具体代码,供大家参考,具体内容如下应用名称:java动态模拟时钟用到的知识:javaGUI,jav
- 一、算法描述波雷费密码是一种对称式密码,是首种双字母取代的加密法。下面描述算法步骤:1、从1号二维码M05,提取明文信息和密文,M05格式:
- 本文实例为大家分享了Java实现带图形界面聊天程序的具体代码,供大家参考,具体内容如下ServerDemo01.javaimport jav
- groovy是一种动态脚本语言,适用于一些可变、和规则配置性的需求,目前Spring提供ScriptSource接口,支持两种类型,一种是R
- 导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用
- 本文实例讲述了Java实现的傅里叶变化算法。分享给大家供大家参考,具体如下:用JAVA实现傅里叶变化 结果为复数形式 a+bi废话不多说,实
- 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1)
- 本文为大家分享了使用entrySet方法获取Map集合中元素的具体代码,供大家参考,具体内容如下/*--------------------
- 今天遇到pom中添加dependency时相关的jar会自动下载,但是左边的External Libraries中一直获取不到添加的jar问
- 本文实例讲述了C#获取上个月第一天和最后一天日期的方法。分享给大家供大家参考。具体实现代码如下:int year = DateTime.No
- 一般入参我们都会转为vo对象。那么直接在对象的属性上注解即可。 其实spring用的是hibernate的validator.步骤1.配置s
- 定义可理解为 适配广泛的类型,即参数化类型,可以把类型像方法的参数那样进行传递。// 以ArrayList为示例// 泛型T可以是任意类pu