2009年1月2日星期五

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

摘自:http://www.cnblogs.com/bjzhanghao/archive/2004/07/30/28607.html

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,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐 个赋值:

//得到TeacherForm
TeacherForm 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后,代码就大大改观了,如下所示:

//得到TeacherForm
TeacherForm 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异常。


评论

#1楼  2005-11-17 09:18 olaola [未注册用户]
为什么我用PropertyUtils在copy不同类型的属性时候出现argument type mismatch错误呢。

#2楼  2005-12-15 14:35 vk2001 [未注册用户]
文中的"前者"应该是BeanUtils
"后者"应该是指PropertyUtils吧?

#3楼  2005-12-15 14:38 vk2001 [未注册用户]
刚才说反了,
"前者"是PropertyUtils
"后者"是BeanUtils
BeanUtils能提供类型转换.

#4楼  2006-10-10 11:08 孙建彬 [未注册用户]
java.lang.Bigdecimal????????
有这个类吗?应该是java.math.Bigdecimal,BeanUtils对这个类不支持的

BeanUtils 支持类型转换啊
PropertyUtils 不支持啊
  

#6楼  2008-03-05 13:20 游客 [未注册用户]
1。8commons-beanutils版本的没有问题呀。是否你的版本太低了?


#7楼  2008-03-05 14:08 游客 [未注册用户]
1。8commons-beanutils版本的没有问题呀。是否你的版本太低了?
环境问题:如果不在hibereate中,日期copy是没有问题的。
但是使用hiberate后,即dao.get(某个对象),系统好像类型都变成了Timestamp,可能是Timestamp和Date直接类型不同导致的不能拷贝问题。


没有评论: