仅写给自己看看吧,以后在敲代码的时候注意一些!
列举一些语法、逻辑在使用的时候可能忽略的小细节!虽然不太实用,这些问题在报错的时候Debug都能发现,当然为了提高效率,使用BeanUtils.copyProperties的时候还是有这个意识吧!
1.BeanUtils.copyProperties(aDom,bDom);
- 如果有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm。例如:一个用户注册页面,有一个User实体类和一个UserActionForm,我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:
例如:A表示含有属性,a表示不含有!
属性 | name | age | sex | high | weight | tennis | bsket |
---|---|---|---|---|---|---|---|
aDom | A | A | A | A | A | a | a |
bDom | A | A | A | A | A | A | A |
- 问题:假设我们要将aDom的属性对应传到bDom里面去
传统方法:
//向bDom中设置aDom中含有的属性
bDom.setName(aDom.getName);
bDom.setAge(aDom.getAge);
bDom.setSex(aDom.getSex);
bDom.setHigh(aDom.getHigh);
bDom.setWeight(aDom.getWeight);
bDom.setName(aDom.getName);
简便方法:
//向bDom中设置aDom中含有的属性
BeanUtils.copyProperties(aDom,bDom);
- 如果使用传统的方法,Bean里面的属性太多的话,那就变得不现实了,所以BeansUtil.copyProperties简化了很多,一条代码便搞定!
容易遗漏的小细节来了:
-
1、很多时候我们在拷贝了属性以后容易忘记单独设置剩下两个属性!
所以在以上代码完成的时候,需要单独添加属性!
处理方法:
BeanUtils.copyProperties(aDom,bDom);
bDom.setTennis("网球");
bBom.setBsket("篮球");
- 2、假如我们的两个类是数据传输类,两个都拥有相同的属性,但有着不同的初始值!如下
属性 | name | age | sex | high | weight | tennis | bsket |
---|---|---|---|---|---|---|---|
aDom | aa | 12 | 男 | 178 | 58 | Null | Null |
bDom | Null | Null | Null | Null | Null | Null | Null |
在表中tennis和bsket都是没有值的!需要我们单独赋值,在克服第一个疏忽之后我们还可能疏忽的是代码顺序!
bDom.setTennis("网球");
bBom.setBsket("篮球");
BeanUtils.copyProperties(aDom,bDom);
- 当我们使用上面代码的时候,最后你会发现你赋的值变为了Null ,为什么呢?其实细细理一下思路就能发现!我们使用BeanUtils.copyProperties复制属性的时候aDom的Null值将你set的值给覆盖了!
- 处理方法也很简单:
//只需要调整一下代码顺序即可,先copy再赋值,就不会被覆盖了!
BeanUtils.copyProperties(aDom,bDom);
bDom.setTennis("网球");
bDom.setBsket("篮球");
- 3、还有一种容易忽略的情况,和第二种差不多!两者属性默认值如下:
属性 | name | age | sex | high | weight | tennis | bsket |
---|---|---|---|---|---|---|---|
aDom | aa | Null | 男 | Null | 58 | Null | Null |
bDom | Null | 18 | Null | 185l | Null | Null | Null |
在避免1、2两种疏忽之后,第三种其实也很简单,两者默认属性有交叉的!在将aDom的属性copy到bDom的时候,aDom其本身的Null属性会覆盖掉bDom已有的属性!这个时候如果采用BeanUtils.copyProperties复制属性的时候,age和high不可避免需要单独set赋值。
解决方法:
BeanUtils.copyProperties(aDom,bDom);
bDom.setAge("18");
bDom.setHigh("185");
bDom.setTennis("网球");
bDom.setBsket("篮球");
综上所述,如果使用BeanUtils.copyProperties,有需要单独赋值的属性尽量放在copy语句的后面,防止copy的时候被覆盖掉!当然使用BeanUtils.copyProperties只能拷贝属性名字相同的属性,如果对应的属性名称不一样的话就需要我们自定义converter对象转换工具类了!
声明:本文为作者学习心得,养成记录学习的好习惯吧!如有错误,望指正,谢谢!