2019独角兽企业重金招聘Python工程师标准>>>

Commons BeanUtils包学习2 博客分类: 中间件 java

一、简介:
BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

二、用法:
BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:
public static void copyProperties(java.lang.Object dest,java.lang.Object orig) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException

如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

//得到
TeacherFormTeacherForm
teacherForm=(TeacherForm)form;//构造Teacher对象
Teacher teacher=new Teacher();//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

而使用BeanUtils后,代码就大大改观了,如下所示:
//得到
TeacherFormTeacherForm
teacherForm=(TeacherForm)form;//构造Teacher对象
Teacher teacher=new Teacher();//赋值
BeanUtils.copyProperties(teacher,teacherForm);//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:

teacher.setModifyDate(new Date());

怎么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:

* java.lang.BigDecimal * java.lang.BigInteger * boolean and java.lang.Boolean * byte and java.lang.Byte * char and java.lang.Character * java.lang.Class * double and java.lang.Double * float and java.lang.Float * int and java.lang.Integer * long and java.lang.Long * short and java.lang.Short * java.lang.String * java.sql.Date * java.sql.Time * java.sql.Timestamp
这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

三、优缺点:
Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我将说明如何使用BeanUtils将local实体bean转换为对应的value 对象:
BeanUtils.copyProperties(aValue, aLocal)
上面的代码从aLocal对象复制属性到aValue对象。它相当简单!它不管local(或对应的value)对象有多少个属性,只管进行复制。我们假设local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了!太强大了!太有用了!

现在,还有一个坏消息:使用BeanUtils的成本惊人地昂贵!我做了一个简单的测试,BeanUtils所花费的时间要超过取数据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力!

Common BeanUtils简单使用
属性的动态getter、setter
有时候属性是要根据名字动态取得的:  
BeanUtils.getProperty(myBean,"code");
而Common BeanUtils的更强功能在于可以直接访问内嵌对象的属性,只要使用点号分隔。
BeanUtils.getProperty(orderBean, "address.city");
相比之下其他类库的BeanUtils通常都很简单,不能访问内嵌的对象,所以有时要用Commons BeanUtils来替换它们。BeanUtils还支持List和Map类型的属性,如下面的语法即可取得Order的顾客列表中第一个顾客的名字。
BeanUtils.getProperty(orderBean, "customers[1].name");
其中BeanUtils会使用ConvertUtils类把字符串转为Bean属性的真正类型,方便从HttpServletRequest等对象中提取bean,或者把bean输出到页面。
而PropertyUtils就会原色的保留Bean原来的类型。
2.BeanCompartor 动态排序
还是通过反射,动态设定Bean按照哪个属性来排序,而不再需要在实现bean的Compare接口进行复杂的条件判断。
List peoples = ...; // Person对象的列表
Collections.sort(peoples, new BeanComparator("age"));
如果要支持多个属性的复合排序,如"Order By lastName,firstName"
ArrayList sortFields = new ArrayList();
sortFields.add(new BeanComparator("lastName"));
sortFields.add(new BeanComparator("firstName"));
ComparatorChain multiSort = new ComparatorChain(sortFields);
Collections.sort(rows,multiSort);
其中ComparatorChain属于jakata commons-collections包。
如果age属性不是普通类型,构造函数需要再传入一个comparator对象为age变量排序。
另外, BeanCompartor本身的ComparebleComparator, 遇到属性为null就会抛出异常, 也不能设定升序还是降序。这个时候又要借助commons-collections包的ComparatorUtils.
Comparator mycmp = ComparableComparator.getInstance();
mycmp = ComparatorUtils.nullLowComparator(mycmp); //允许null
mycmp = ComparatorUtils.reversedComparator(mycmp); //逆序
Comparator cmp = new BeanComparator(sortColumn, mycmp);
3.Converter 把Request或ResultSet中的字符串绑定到对象的属性
经常要从request,resultSet等对象取出值来赋入bean中,如果不用MVC框架的绑定功能的话,下面的代码谁都写腻了。
String a = request.getParameter("a");
bean.setA(a);
String b = ....
bean.setB(b);
......
不妨写一个Binder自动绑定所有属性:
MyBean bean = ...;
HashMap map = new HashMap();
Enumeration names = request.getParameterNames();
while (names.hasMoreElements())
{
String name = (String) names.nextElement();
map.put(name, request.getParameterValues(name));
}
BeanUtils.populate(bean, map);
其中BeanUtils的populate方法或者getProperty,setProperty方法其实都会调用convert进行转换。
但Converter只支持一些基本的类型,甚至连java.util.Date类型也不支持。而且它比较笨的一个地方是当遇到不认识的类型时,居然会抛出异常来。对于Date类型,我参考它的sqldate类型实现了一个Converter,而且添加了一个设置日期格式的函数。
要把这个Converter注册,需要如下语句:
ConvertUtilsBean convertUtils = new ConvertUtilsBean();
DateConverter dateConverter = new DateConverter();
convertUtils.register(dateConverter,Date.class);

//因为要注册converter,所以不能再使用BeanUtils的静态方法了,必须创建BeanUtilsBean实例
BeanUtilsBean beanUtils = new BeanUtilsBean(convertUtils,new PropertyUtilsBean());
beanUtils.setProperty(bean, name, value);

public static void copyProperties(Object source, Object target)
throws BeansException
{
BeanCopier beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
beanCopier.copy(source, target, null);
}

public static Object getPropertyValue(Object bean, String property)throws BeansException{
Object value = null;
try{
PropertyDescriptor des = getPropertyDescriptor(bean.getClass(), property);
Method readMethod = des.getReadMethod();
if(!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers()))
readMethod.setAccessible(true);
value = readMethod.invoke(bean, new Object[0]);
}catch(Exception ex){
throw new FatalBeanException("Could not get property["+property+"] value", ex);
}
return value;
}

转载于:https://my.oschina.net/xiaominmin/blog/1598202

Commons BeanUtils包学习2相关推荐

  1. 初识 Apache Commons jar 包

    长篇预警 ,要有耐心才能看下去 1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外 ...

  2. java Apache Commons jar包简介

    一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 二.Commons CLI 说明 ...

  3. beanutil 批量copy_Apache Commons Beanutils对象属性批量复制(pseudo-singleton)

    Apache Commons Beanutils为开源软件,可在Apache官网http://commons.apache.org/proper/commons-beanutils/download_ ...

  4. 包学习(一款安卓端小学到高中全部课程精讲APP)

    简介 [包学习]是一款拥有小学至高中九个学年的全套学习资料的APP,名校名师重点.难点精讲 软件简单介绍 软件分为首页.必刷课.动态教辅.在学.我的五大模块. 进入软件会让你选择对应的年级,小编这里就 ...

  5. 第二课、《抓包学习——美团评论》

    文章目录 第二课.<抓包学习--美团评论> 1.准备工作 2.分析网页 1.选择爬取对象 2.分析链接 3.抓取网页 1.抓包步骤 2.查看数据包并解析 3.爬取链接 4.筛选信息 1.更 ...

  6. ROS 公用包学习解析 usb_cam

    http://blog.sina.com.cn/s/blog_602f87700102wtwz.html http://blog.sina.com.cn/s/blog_602f87700102wtwz ...

  7. Apache Commons Collections包和简介

    背景介绍 Apache Commons是Apache软件基金会的项目,曾经隶属于Jakarta项目.Commons的目的是提供可重用的.解决各种实际的通用问题且开源的Java代码.Commons由三部 ...

  8. python plt包_Python 数据可视化-Matplotlib包学习笔记(一)

    Python 数据可视化 本文主要参照Matplotlib的官方教程进行整理,作为个人的学习笔记进行分享,欢迎相互讨论. Matplotlib包学习笔记(一) 本文主要简单介绍一下Matplotlib ...

  9. BeanUtils包的使用

    BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作. 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: (1)   BeanUtils相 ...

最新文章

  1. WCF分发简述-ChannelDispatcher,EndpointDispatcher,MessageFilter
  2. 为什么(2.55).toFixed(1)等于2.5?
  3. 部署 Node.js 应用以完成服务器端渲染 Server Side Rendering 的性能调优
  4. java drawstring字体大小,JAVA中,drawstring 方法的用法,格式是什么啊
  5. 继承 java 1614784316
  6. 开课吧课堂之如何创建自己的异常子类
  7. (十二)random模块
  8. combineByKey实例详解
  9. linux访问samba命令,smbclient命令
  10. WebClient Exceeded limit on max bytes to buffer : 262144 异常解决
  11. win7win8 64位汇编开发环境合集安装与设置
  12. 基于mysql+php065企业公文流转系统
  13. IAST 技术进阶系列(二):全场景多核驱动
  14. 外文论文查重怎么查?
  15. 【运筹帷幄】网站打开慢故障排查思路
  16. 大型网站技术架构-核心原理与案例分(李智慧 著)第1章-大型网站架构演化
  17. 根据项目或WBS结算规则批量生成下阶WBS的结算规则-CJB2
  18. bitmap的六种压缩方式,Android图片压缩
  19. 计算机网络利弊的作文英语作文,网络的利弊英语作文模板及范文赏析
  20. 高精度三维扫描仪用于医疗器械注塑件尺寸公差测量

热门文章

  1. easyexcel 导出 代码翻译converter_啥?这么简单高效的Excel 导出工具都不知道? 还不快来看!
  2. python运行界面英文翻译_python使用百度api翻译中英文
  3. java swt 菜鸟教程_编程基础学习JS的入门教程
  4. 3399 mysql_MySQL索引
  5. 卷积神经网络只是一种全连接神经网络的特殊情况
  6. 论初始值的重要性-仅仅是更改初始值loss差别就非常大
  7. Leetcode-121. 买卖股票的最佳时机
  8. 编程实现 4 条重写规则,可生成半法式和法式
  9. Java基础 ArrayList和LinkedList的区别和实现原理
  10. 《系统集成项目管理工程师》必背100个知识点-24变更的常见原因