`
shen211
  • 浏览: 47455 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Beanutils使用《转》

    博客分类:
  • java
 
阅读更多
Beanutils用了魔术般的反射技术,实现了很多夸张有用的功能,都是C/C++时代不敢想的。无论谁的项目,始终一天都会用得上它。我算是后知后觉了,第一回看到它的时候居然错过。

1.属性的动态getter、setter

在这框架满天飞的年代,不能事事都保证执行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);
4 其他功能
4.1 ConstructorUtils,动态创建对象
     public static Object invokeConstructor(Class klass, Object arg)
4.2 MethodUtils,动态调用方法
    MethodUtils.invokeMethod(bean, methodName, parameter);

4.3 PropertyUtils,当属性为Collection,Map时的动态读取:
Collection: 提供index

   BeanUtils.getIndexedProperty(orderBean,"items",1);
或者
  BeanUtils.getIndexedProperty(orderBean,"items[1]");
Map: 提供Key Value
  BeanUtils.getMappedProperty(orderBean, "items","111");//key-value goods_no=111
或者
  BeanUtils.getMappedProperty(orderBean, "items(111)")

4.4 PropertyUtils,直接获取属性的Class类型
     public static Class getPropertyType(Object bean, String name)
4.5 动态Bean 见用DynaBean减除不必要的VO和FormBean 
分享到:
评论

相关推荐

    beanutils使用

    本篇文章将深入探讨如何使用BeanUtils库,特别是通过它将Map对象转换为JavaBean的过程。 Apache Commons BeanUtils的核心功能是通过反射机制来操作JavaBean的属性。在Java编程中,JavaBean是一种遵循特定规范的类,...

    使用servlet实现注册&登录&解决注册乱码&beanutils;的使用

    以下是一个简单的使用BeanUtils的例子: ```java import org.apache.commons.beanutils.BeanUtils; public void registerUser(User user, HttpServletRequest request) { try { // 将请求参数填充到User对象 ...

    commons-beanutils-1.9.4

    在本文中,我们将深入探讨`commons-beanutils-1.9.4`这个版本,了解其核心功能、使用场景以及如何在项目中集成和应用。 Apache Commons BeanUtils库的主要目标是简化JavaBean对象的属性访问。它通过提供一系列静态...

    commons-beanutils 源码

    Apache Commons BeanUtils是Java开发中广泛使用的工具库,主要用于处理JavaBean对象的属性操作。这个库的核心功能在于简化了JavaBean对象的属性设置、获取以及复制等操作,使得开发者能够更加方便地进行数据绑定和...

    BeanUtils包

    2. **安全问题:** BeanUtils使用反射机制,如果属性是私有的,需要谨慎使用,因为这可能会暴露对象的内部状态。 3. **性能考虑:** 尽管BeanUtils提供了很多便利,但频繁使用反射可能会带来性能损失,对于性能敏感...

    commons-beanutils-1.8.0

    在BeanUtils中,使用Commons Logging进行日志记录,使得库的使用者可以根据自己的需求自由选择合适的日志系统,增加了项目的可配置性。 然而,`commons-beanutils-1.8.0`版本可能存在一些已知的安全问题,如CVE-...

    beanutils-1.8.3开发包

    Apache BeanUtils库是Java开发中的...不过,由于BeanUtils使用反射,可能存在一定的性能损耗,因此在性能敏感的应用中需要谨慎使用。同时,由于其依赖于JavaBeans规范,对于非JavaBeans对象的操作可能需要额外的适配。

    Commons BeanUtils 1.8.3 API

    例如,当需要将数据库查询结果映射到Java Bean对象时,使用BeanUtils的`populate()`方法可以快速完成这一任务。同时,由于BeanUtils库是Apache Commons的一部分,它经过了广泛测试和社区的验证,可靠性较高。 总结...

    beanutils包

    - **通用工具**:BeanUtils作为一个通用的工具包,其很多功能在框架的其他部分也能发挥作用,比如在视图渲染阶段,可以使用BeanUtils获取对象的属性值,以便在模板引擎中展示。 总结来说,Apache Commons BeanUtils...

    BeanUtils jar包+源码

    3. **类型转换**:BeanUtils内部使用了`PropertyUtils`类来处理属性的类型转换,当源对象和目标对象的属性类型不一致时,它会尝试进行自动类型转换。然而,这种转换并不总是成功,对于一些复杂类型的转换,可能需要...

    commons-beanutils-1.8.2-src官方源文件,是你学习beanutils工具的必备资料

    总的来说,"commons-beanutils-1.8.2-src"官方源文件包是学习Java Bean操作的宝贵资源,通过研究源代码,开发者不仅可以掌握BeanUtils的使用,还能进一步提升对Java反射和类型转换的理解,从而提高开发效率和代码...

    commons-beanutils-1.8.3和commons-beanutils-1.8.0

    - **安全性增强**:对于旧版本的安全漏洞,新版本可能会进行修复,确保在使用过程中的安全性。 在实际项目中,升级到`commons-beanutils-1.8.3`可能会带来更好的性能和稳定性,但也需要注意检查与现有代码的兼容性...

    beanutils的jar包

    本篇文章将深入探讨Apache Commons BeanUtils的核心功能、使用场景以及如何有效地利用这个库来提升代码的效率和可读性。 Apache Commons BeanUtils是Apache软件基金会开发的一个开源项目,它是Apache Commons项目的...

    beanutils 的jar包

    本文将深入探讨BeanUtils的核心功能及使用方法。 BeanUtils是Apache Commons项目的一部分,它的主要目标是提供一套便捷的工具方法,用于处理JavaBean对象。JavaBean是一种遵循特定设计规范的Java类,通常包含公共的...

    beanutils JAR包下载

    在本文中,我们将深入探讨BeanUtils库,特别是关注`beanutils-1.8.3 JAR包`的特性、使用方法以及在实际开发中的应用。 首先,BeanUtils库是Apache Commons项目的一部分,它提供了一组方便的API,使得开发者可以更加...

    BeanUtils所需的包

    使用BeanUtils,开发者可以避免手动编写大量的getter和setter方法来实现对象间的属性复制。例如,BeanUtils.copyProperties()方法允许我们快速地将一个对象的所有属性复制到另一个对象中。这在处理数据模型或业务...

    BeanUtils工具 .jar 包

    6. **国际化支持**:BeanUtils工具包可以与ResourceBundle结合使用,实现基于不同语言和地区的国际化(i18n)处理。 在"java学习笔记——javaweb之BeanUtils、EL、JSTL"这篇博客中,作者可能详细讲解了如何在Java Web...

    commons-beanutils-1.9.2下载

    标题"commons-beanutils-1.9.2下载"指的是Apache Commons BeanUtils库的1.9.2版本,这是一个开源的、稳定且广泛使用的版本。下载这个库的目的是为了在项目中引入它的功能,以便于处理Java对象的属性操作。 Apache ...

Global site tag (gtag.js) - Google Analytics