一, 简介:
BeanUtils 提供对 Java 反射和自省 API 的包装. 其主要目的是利用反射机制对 JavaBean 的属性进行处理. 我们知道, 一个 JavaBean 通常包含了大量的属性, 很多情况下, 对 JavaBean 的处理导致大量 get/set 代码堆积, 增加了代码长度和阅读代码的难度.
二, 用法:
如果你有两个具有很多相同属性的 JavaBean, 一个很常见的情况就是 Struts 里的 PO 对象 (持久对象) 和对应的 ActionForm. 例如: 一个用户注册页面, 有一个 User 实体类和一个 UserActionForm, 我们一般会在 Action 里从 ActionForm 构造一个 PO 对象, 传统的方式是使用类似下面的语句对属性逐个赋值:
- [html] view plain https://blog.csdn.net/mr_linjw/article/details/50236279# copy https://blog.csdn.net/mr_linjw/article/details/50236279#
- // 获取 ActionForm 表单数据
- UserActionForm uForm = (UserActionForm) form;
- // 构造一个 User 对象
- User user = new User();
- // 逐一赋值
- user.setUsername(uForm.getUsername);
- user.setPassword(uForm.getPassword);
- user.setAge(uForm.getAge);
- // 然后调用 JDBC, 或操作 Hibernate 持久化对象 User 到数据库
通过这样的方法如果表单数据 N 多, 100,1000(夸张点. 哈哈),,,, 那我们不是要写 100,,,1000 行 set,get 了. 谁都不愿意这样做.
而我们使用 BeanUtils.copyProperties() 方法以后, 代码量大大的减少, 而且整体程序看着也简洁明朗, 代码如下:
- [html] view plain https://blog.csdn.net/mr_linjw/article/details/50236279# copy https://blog.csdn.net/mr_linjw/article/details/50236279#
- // 获取 ActionForm 表单数据
- UserActionForm uForm = (UserActionForm) form;
- // 构造一个 User 对象
- User user = new User();
- // 赋值
- BeanUtils.copyProperties(user, uForm);
- // 然后调用 JDBC, 或操作 Hibernate 持久化对象 User 到数据库
- .......
注: 如果 User 和 UserActionForm 间存在名称不相同的属性, 则 BeanUtils 不对这些属性进行处理, 需要手动处理. 例如:
User 类里面有个 createDate 创建时间字段, 而 UserActionForm 里面无此字段. BeanUtils.copyProperties()不会对此字段做任何处理. 必须要自己手动处理.
Date 为 null 时拷贝会报错
而 commons-beanutils 则施加了很多的检验, 包括类型的转换, 甚至于还会检验对象所属的类的可访问性.
而且, commons-beanutils 中的装换是不支持 java.util.Date 的. 除了支持基本类型以及基本类型的数组之外, 还支持 java.sql.Date, java.sql.Time, java.sql.TimeStamp, java.io.File, javaio.URL 这些类的对象, 其余一概不支持. 不过你可以自定义你的类的 Converter. 然后注册进去.
感觉 commons-beanutils 包中的这个 BeanUtils 类的 copyProperties 方法, 太过复杂, 约束太多, 而且使用不便, 虽然可扩展性好了, 但是易用性不高.
总结:
关于 bean 复制, 如果属性较少, 建议直接写个方法完成 get/set 即可. 如果属性较多, 可以自己采用反射实现一个满足自己需要的工具类, 或者使用 spring 的那个 beanutils 类, 不建议使用 commons-beanutils 包中的那个 BeanUtils 类, 刚看了下, 这个类对于内部静态类的对象复制也会出现问题, 检验太复杂了, 常会出现一些诡异的问题. 毕竟我们 bean 复制一般就是简单的属性 copy 而已.
而且, 由于这些 BeanUtils 类都是采用反射机制实现的, 对程序的效率也会有影响. 因此, 慎用 BeanUtils.copyProperties!!!
除 BeanUtils 外还有一个名为 PropertyUtils 的工具类, 它也提供 copyProperties()方法, 作用与 BeanUtils 的同名方法十分相似, 主要的区别在于后者提供类型转换功能, 即发现两个 JavaBean 的同名属性为不同类型时, 在支持的数据类型范围内进行转换, 而前者不支持这个功能, 但是速度会更快一些
来源: http://www.bubuko.com/infodetail-2658829.html