Java中BeanUtils.copyProperties基本用法与小坑
目录
- (1)实际应用
- (2) 使用要注意的小坑
- (3)以springframework.beans的BeanUtils.copyPropert编程ies为例,快速看几眼源码,不难理解
(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.copyPropertieandroids(b,a); System.out.println("b: "+b.toString()); }
赋值失败
为什么呢?因为,它底层是通过反射获取对象里面的每个属性,再通过get,set获取和设值,不提供get,set,就当然没办法复制了。
4:加@Data注解
我们知道lombok.Data包中的@Data注解可以帮助我们省去get,set方法,那么不写getset,加@Data行不行?
结果是可以的,我个人理解的注解的本质就是切面编程,把一些固定的逻辑通过增强型代理类配置进去,外部在使用的时候也就是使用增强型代理类的方法,而@Data类似一些省事的语法糖,帮助我们“写”了那堆get,set方法供别人调用。ZCZdzixPsY
5:参数名不一致的,不能编程客栈复制成功
注意,参数名必须严格一致,js例如:A.name 对应 B.name,如果是B.nAme或者B.names,那就肯定不行了!
如果刚好两个实体类参数名不一致,怎么办呢?那只能用老的写法B.setNames(A.getName());(3)以springframework.beans的BeanUtils.copyProperties为例,快速看几眼源码,不难理解
第一个参数是源,第二个参数是目标对象
红色方法就是反射创建对象方法
到此这篇关于Java中BeanUtils.copyProperties基本用法与小坑的文章就介绍到这了,更多相关BeanUtils.copyProperties用法内容请搜索我们以前的文章或继续浏览开发者_C教程下面的相关文章希望大家以后多多支持我们!
精彩评论