一个分享个人学习、开发经验的Blog,http://www.joyphper.net

利用BeanUtils在对象间复制属性(copyProperties)

posted @ 2012-05-25 09:48 | 阅读:2879 | 评论:0 | 分类: Java

commons-beanutils是jakarta commons子项目中的一个软件包,其主要目的是利用反射机制对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,例如User和myForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

//得到MyForm
MyForm myForm=(MyForm)form;
//构造User对象
User user=new User();
//赋值
user.setName(myForm.getName());
user.setAge(myForm.getAge());
user.setJob(myForm.getJob());
user.setMail(myForm.getMail());
...
//持久化Teacher对象到数据库
HibernateDAO=...;
HibernateDAO.save(user);

而使用BeanUtils后,代码就大大改观了,如下所示:

//得到MyForm
MyForm myForm=(MyForm)form;
//构造User对象
User user=new User();
//赋值
BeanUtils.copyProperties(user,myForm);
//持久化Teacher对象到数据库
HibernateDAO=...;
HibernateDAO.save(user);

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

user.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异常。

TAG: java , BeanUtils , 复制属性 , copyProperties

共有0条评论 发表评论>>

点击换一张验证码