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
猜你喜欢
- 一、邮件协议MTA 和 MDA 这样的服务器软件通常是现成的,我们通常不会关心这些邮件服务器的内部是如何运行 的。更多的需求场景,是需要发送
- 之前一篇文章中我们讲了基于Mysql8的读写分离(文末有链接),这次来说说分库分表的实现过程。概念解析垂直分片按照业务拆分的方式称为垂直分片
- 通过使用java mail来实现读取163邮箱,qq邮箱的邮件内容。1.代码实现创建springboot项目,引入依赖包<!--mai
- 摘要本文主要讲解mall整合SpringTask的过程,以批量修改超时订单为例。SpringTask是Spring自主研发的轻量级定时任务工
- 记录一下工作流的在Springboot中的使用,,顺便写个demo,概念,什么东西的我就不解释了,如有问题欢迎各位大佬指导一下。1.创建sp
- 关于Maven的使用就不再啰嗦了,网上很多,并且这么多年变化也不大,这里仅介绍怎么搭建Hadoop的开发环境。1. 首先创建工程mvn ar
- mybatis 查询返回Map<String,Object> 类型,平时没太注意怎么用,今天又遇到了总结记录一下,方便以后处理此
- Java的SPI机制实例详解SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或
- 一、定义责任链模式(Chain of Responsibility Pattern):避免将一个请求的发送者与接受者耦合在一起,让多个对象都
- 如下所示:package com.unionx.wanxue; import java.util.Map; import java.util
- 泛型概述我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进
- 概念 在 HTML 中,<a>, <form>, <img>, <script>,
- 一、基本使用它们是 LockSupport 类中的方法// 暂停当前线程LockSupport.park(); // 恢复某个线程的运行Lo
- 目录一、抽象类1.抽象类概述1.1 为什么要有抽象类?(抽象类的作用)1.2 抽象类的定义2. 抽象类特点3.抽象类成员特点4.抽象类案例二
- 其实写到这里,我已经差不多断气了。。。常规套路,这里是前三篇的传送门,需要的同学可以看一下:JAVA写文本编辑器(三) JAVA写文本编辑器
- 在网上拷贝的所有阿里云镜像比如:<mirror> <id>nexus-aliyun</id>
- 错误Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率。其实就
- 随着C语言的学习慢慢结束,博主也要开始学习一门新语言了,那就是java。所以博主将会开启一个新的关于java的专栏,所以想要慢慢和我一起学习
- Java7 中 ConcurrentHashMapConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发
- zenDiscovery实现机制ping是集群发现的基本手段,通过在网络上广播或者指定ping某些节点获取集群信息,从而可以找到