`

(转)BeanUtils的用法

    博客分类:
  • Java
阅读更多

1.   概述

       第一次接触BeanUtils是在学习Struts的过程中,在Struts中它被大量用于处理FormBean

BeanUtils主要提供了对于JavaBean进行各种操作,

       BeanUtils一共分4个包:

Ø         org.apache.commons.beanutils

Ø         org.apache.commons.beanutils.converters

Ø         org.apache.commons.beanutils.locale

Ø         org.apache.commons.beanutils.locale.converters

其中上面两个是BeanUtils的默认实现,它没有针对本地化的任何处理,这个可以提高执行效率。但是若你的程序对于本地化有要求的话,那还是使用下面2个包比较安全。

 

2.   org.apache.commons.beanutils

       这个包主要提供用于操作JavaBean的工具类,Jakarta-Common-BeanUtils的主要功能都在这个包里实现。

    下面分别介绍几个主要的工具类:

2.1.BeanUtil

1、首先,我先定义一个JavaBean作为之后例子的操作对象。

    public class Company

    {

      private String name;

      private HashMap address = new HashMap();

      private String[] otherInfo;

      private ArrayList product;

      private ArrayList employee;

      private HashMap telephone;

 

      public Company(){}

 

      public String getName()

      {

        return name;

      }

      public void setName(String name)

      {

        this.name = name;

      }

 

      public String getAddress(String type)

      {

        return address.get(type).toString();

      }

      public void setAddress(String type, String address)

      {

        this.address.put(type,address);

      }

 

      public String[] getOtherInfo()

      {

        return otherInfo;

      }

      public void setOtherInfo(String[] otherInfo)

      {

        this.otherInfo = otherInfo;

      }

 

      public ArrayList getProduct()

      {

        return product;

      }

      public void setProduct(ArrayList product)

      {

        this.product = product;

      }

 

      public ArrayList getEmployee()

      {

        return employee;

      }

      public void setEmployee(ArrayList employee)

      {

        this.employee = employee;

      }

 

      public HashMap getTelephone()

      {

        return telephone;

      }

      public void setTelephone(HashMap telephone)

      {

        this.telephone = telephone;

      }

    }

2BeanUtils可以直接getset一个属性的值。它将property分成3种类型:

       Simple——简单类型,如StirngInt……

       Indexed——索引类型,如数组、arrayList……

       Maped——这个不用说也该知道,就是指Map啦,比如HashMap……

       访问不同类型的数据可以直接调用函数getPropertysetProperty。它们都只有2个参数,第一个是JavaBean对象,第二个是要操作的属性名。

 

Company c = new Company();

c.setName("Simple");

 

对于Simple类型,参数二直接是属性名即可

//Simple

    System.out.println(BeanUtils.getProperty(c, "name"));

    对于Map类型,则需要以“属性名(key值)”的形式

//Map

    System.out.println(BeanUtils.getProperty(c, "address (A2)"));

    HashMap am = new HashMap();

    am.put("1","234-222-1222211");

    am.put("2","021-086-1232323");

    BeanUtils.setProperty(c,"telephone",am);

    System.out.println(BeanUtils.getProperty(c, "telephone (2)"));

    对于Indexed,则为“属性名[索引值]”,注意这里对于ArrayList和数组都可以用一样的方式进行操作。

//index

    System.out.println(BeanUtils.getProperty(c, "otherInfo[2]"));

    BeanUtils.setProperty(c, "product[1]", "NOTES SERVER");

    System.out.println(BeanUtils.getProperty(c, "product[1]"));

 

       当然这3种类也可以组合使用啦!

    //nest

    System.out.println(BeanUtils.getProperty(c, "employee[1].name"));

 

3、此外,还有一个很重要的方法copyProperty,可以直接进行Bean之间的clone

       Company c2 = new Company();

        BeanUtils.copyProperties(c2, c);

       但是这种copy都是浅拷贝,复制后的2Bean的同一个属性可能拥有同一个对象的ref,这个在使用时要小心,特别是对于属性为自定义类的情况。

4、最后还有populate,它用于将一个map的值填充到一个bean中,其函数原型如下:

public void populate(java.lang.Object bean,

                java.util.Map properties)

              throws java.lang.IllegalAccessException,

                     java.lang.reflect.InvocationTargetException

struts中这个函数被用于从http request中取得参数添加到FormBean,目前好像我也没有看到这个函数还有什么其他的用途?!以后想到再说吧:P

 

2.2.LazyDynaBean

       它实现一个动态的Bean,可以直接往里面加入属性,作为一个JavaBean一样使用,也可以用上面的BeanUtilsget/set方法进行操作,而不用事先定义一个标准的JavaBean类啦:)

记得在J2ee设计模式中有一种Value Object的模式,用于在MVC各层之间传递数据,避免直接传递大业务对象引起的性能问题,为了避免在项目中出现很多Bean类,在书中提供了一个动态Value Object的实现(通过扩展Map)。这里LazyDynaBean则可以作为一种更加成熟、稳定的实现来使用。呵呵,原来曾打算自己写一个类似的value object类的,现在看来可以直接用这个啦:P

       言归正传,LazyBean的确提供了一个很不错的DynaBean的实现。而且就像它的名字中表述的那样,它的确是为我这样的懒人考虑的很周到,用起来几乎不需要写什么多余的代码^_^,下面就看看使用的例子吧!

         //这里使用LazyDynaMap,它是LazyBean的一个轻量级实现

      LazyDynaMap dynaBean1 = new LazyDynaMap();

 

      dynaBean1.set("foo", "bar");                  // simple

      dynaBean1.set("customer", "title", "Mr");        // mapped

      dynaBean1.set("address", 0, "address1");         // indexed

      System.out.println(dynaBean1.get("address",0));

 

      Map myMap = dynaBean1.getMap();           // retrieve the Map

      System.out.println(myMap.toString());

       上面的例子可以看到,它可以在set时自动增加beanproperty(既赋值的同时增加Bean中的property),同时也支持3中类型的property,并且LazyDynaMap还可以导出为map

       对于这个类还有两个重要的Field要注意:

       returnnull——指定在get方法使用了一个没有定义过的property时,DynaBean的行为。

         //取的字段的信息

      dynaBean1.setReturnNull(true);//设为ture。若Bean中没有此字段,返回null

                                //默认为false。若Bean中没有此字段,自动增加一个:)

      System.out.println(dynaBean1.get("aaa"));//此时返回null

       Restricted——指定是否允许改变这个beanproperty

//MutableDynaClass.setRestricted设为true后,字段不可再增删和修改.

      //默认为false,允许增删和修改

      dynaBean1.setRestricted(true);

      dynaBean1.set("test","error");//这里会出错!

       通过设置这两个属性,可以防止意外修改DynaBeanproperty。在设计架构时,你可以在后台从数据表或xml文件自动产生DynaBean,在传到控制层和表示层之前设置上述属性使其Bean结构不允许修改,如此就不可能无意中修改Bean包含的属性……这样既可以享用它的便利,有可以防止由此引入的错误可能,设计者实在深得偷懒的精髓啊!!!!!

 

3.   其他

3.1.BeanUtilsPropertyUtils

       这两个类几乎有一摸一样的功能,唯一的区别是:BeanUtils在对Bean赋值是会进行类型转化。举例来说也就是在copyProperty时只要属性名相同,就算类型不同,BeanUtils也可以进行copy;而PropertyBean则可能会报错!!

       针对上面的例子,新建一个Company2的类,其中代码与Company一样,只是将otherinfoString[]改为String

      Company c = init();

      Company2 c2 = new Company2();

     

      BeanUtils.copyProperties(c2,c);

//      PropertyUtils.copyProperties(c2,c); 这句会报错!!

      System.out.println(c2.getOtherInfo());

    当然2Bean之间的同名属性的类型必须是可以转化的,否则用BeanUtils一样会报错。

       若实现了org.apache.commons.beanutils.Converter接口则可以自定义类型之间的转化。

由于不做类型转化,用PropertyUtils在速度上会有很大提高!

此外,不作类型转化还有一个好处,如下面的代码:

      //test data type convert

//      ArrayList a1 = BeanUtils.getProperty(c,"product"); //BeanUtils返回的是String

      System.out.println("--" + BeanUtils.getProperty(c,"product"));     //取出后直接被转为String

      ArrayList a = (ArrayList)PropertyUtils.getProperty(c,"product");//PropertyUtils返回的是Object

      System.out.println("--" + a.get(1));

BeanUtils无法返回一个对象(除非自己写一个Converter),它会自动进行类型转化,然后返回String。对于想返回java类或自定义类的话,还是不要老它大驾转化了。

 

3.2.Utils

       所有的XXXUtils类都提供的是静态方法,可以直接调用,其主要实现都在相应的XXXUtilsBean中:

BeanUtils     ——> BeanUtilsBean

       ConvertUtils  ——> ConvertUtilsBean

    PropertyUtils ——> PropertyUtilsBean

 

其意思看类名也应该知道的差不多了,我就不再废话啦!当然你也可以直接调用那些XXXUtilsBean,功能都一样!

分享到:
评论

相关推荐

    Beanutils基本用法.doc

    ### Beanutils基本用法详解 #### 一、Beanutils简介 Beanutils是一个强大的Java工具类库,主要用于简化JavaBean的属性操作。它提供了一系列的方法帮助开发者处理Bean的属性读取、设置以及转换等问题,尤其在处理...

    beanutils使用

    现在,我们可以创建一个Map对象并填充数据,然后使用BeanUtils的`populate()`方法: ```java Map, Object> map = new HashMap(); map.put("name", "张三"); map.put("age", 25); MyBean myBean = new MyBean(); ...

    Commons BeanUtils 1.8.3 API

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

    commons-beanutils-1.9.4

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

    commons-beanutils 源码

    - **属性访问**:BeanUtils提供了`getProperty()`和`setProperty()`方法,可以方便地读取和设置JavaBean对象的属性值,无需关注getter和setter方法的具体实现。 - **类型转换**:BeanUtils具备自动类型转换的能力...

    BeanUtils-jar包

    通过熟练掌握BeanUtils的用法,开发者可以更高效地处理对象属性的读取、设置和复制,进一步提升开发效率。在实际项目中,合理利用BeanUtils-jar包,可以有效地减少重复代码,使程序设计更加简洁和灵活。

    beanutils 的jar包

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

    beanutils包

    BeanUtils库是Apache软件基金会开发的一个开源项目,其核心功能在于提供了一系列便捷的方法,帮助开发者更高效地操作JavaBeans对象。本篇文章将深入探讨BeanUtils包的使用、功能及其在网络框架中的应用。 Apache ...

    commons-beanutils-1.8.0

    通过使用BeanUtils,开发者可以避免编写大量重复的getter和setter方法,从而提高开发效率。 在`commons-beanutils-1.8.0.jar`中,主要类有`BeanUtils`和`PropertyUtils`。`BeanUtils`类提供了简单易用的API,如`...

    beanutils-1.8.3开发包

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

    commons-beanutils-1.8.3和commons-beanutils-1.8.0

    1. **属性访问**:BeanUtils提供了一系列方法如`getProperty()`和`setProperty()`,可以方便地读取和设置JavaBean对象的属性,无需手动编写getter和setter方法。 2. **类型转换**:通过`convert()`方法,BeanUtils...

    BeanUtils包

    BeanUtils库是基于JavaBeans规范的,JavaBeans是一种符合特定规则的Java类,它们通常具有公有的getter和setter方法,用于封装和解封装对象的数据。 **BeanUtils的核心功能:** 1. **属性设置和获取:** BeanUtils...

    BeanUtils jar包+源码

    5. **自定义转换**:如果内置的类型转换不能满足需求,可以通过实现`PropertyEditor`接口创建自定义的属性编辑器,然后通过`registerCustomEditor()`方法注册到BeanUtils中,这样在进行属性赋值时,会优先使用自定义...

    commons-beanutils-1.9.4-API文档-中文版.zip

    赠送jar包:commons-beanutils-1.9.4.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    beanutils-logging.zip

    1. **属性复制**:BeanUtils.copyProperties()方法能够将一个JavaBean的所有属性值复制到另一个同类型的JavaBean中,极大地提高了代码的复用性和可维护性。 2. **动态调用setter/getter**:通过反射机制,BeanUtils...

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

    - **PropertyDescriptor**:BeanUtils内部使用了JavaBeans的`PropertyDescriptor`,它描述了一个Bean的属性,包括其getter和setter方法。 - **反射机制**:BeanUtils大量利用Java的反射API来动态地获取和设置Bean...

    commons-beanutils-1.9.2下载

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

    beanutils JAR包下载

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

    beanUtils jar 包,还包括source和doc

    本文将详细探讨BeanUtils的功能、使用方法以及其背后的源码解析。 1. **BeanUtils的核心功能** - **属性复制**:BeanUtils最核心的功能就是实现对象间的属性复制。通过`copyProperties()`方法,可以将一个对象的...

Global site tag (gtag.js) - Google Analytics