在Java的业务代码开发中,经常要对JavaBean进行一些啰嗦的操作,比如一行行的a.setXXX(b.getXXX())
。commons-beanutils
提供了一组用于JavaBean操作的工具类,能够简化我们的代码,尤其是对一些历史遗留问题代码,能够改善代码可读性、充分解耦。当然,此类工具大量依赖反射操作,还有自动类型转换等额外处理,性能肯定不如直接硬编码,我们在开发过程中,这一点需要时刻结合应用场景来考虑。
注:据说commons-beanutils
中的最常用的BeanUtils
代码臃肿、性能较差,很多人推荐使用Spring自带的BeanUtils
作为替代。这里我们只是学习一下其设计思路,我们完全可以用反射自己封装类似的功能,具体就不深究了。
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
我们可以使用BeanUtils
或PropertyUtils
进行任意两个对象之间的属性拷贝。
BeanUtils.copyProperties(Object dest, Object orig)
该方法能够将对象orig
中的字段浅拷贝到对象dest
中,拷贝的规则为字段名相同,要求字段具备get\set
方法。
下面代码中,Customer
和CustomerVo
具有部分相同名字的字段,copyProperties()
方法能够实现从customer
拷贝属性到customerVo
。
Customer customer = new Customer();
customer.setCustId(198l);
customer.setAge(23);
customer.setName("测试客户");
customer.setRemark("已拉黑");
customer.setAddress("噜啦啦街");
CustomerVo customerVo = new CustomerVo();
BeanUtils.copyProperties(customerVo, customer);
注意:
PropertyUtils
也有一个copyProperties
方法,用法基本相同,唯一的区别是BeanUtils
会对8个基本类型进行自动转换,我们使用时可以根据需求自行选择。这类方法一般用于一些历史遗留代码,比如一个很古老的项目函数之间传参全用Map
,直接通过对象和Map互转工具,能够很方便的实现对这类代码的再次封装。
对象转Map:
PropertyUtils.describe(Object bean)
该方法返回Map<String, Object>
。
注意:
BeanUtils
也有一个describe
方法,用法基本相同,但返回值是Map<String, String>
,其内部会自动进行类型转换,我们使用时可以根据需求自行选择。Map转对象:
BeanUtils.populate(Object bean, Map<String, ? extends Object> properties)
该方法能够将Map中的值,拷贝到对应key名字的字段中,注意其会进行自动类型转换。