﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Kenny Qiu java blog</title><link>http://www.blogjava.net/KennyQiu/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 07:24:42 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 07:24:42 GMT</pubDate><ttl>60</ttl><item><title>BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别</title><link>http://www.blogjava.net/KennyQiu/archive/2008/12/24/248038.html</link><dc:creator>KennyQiu</dc:creator><author>KennyQiu</author><pubDate>Wed, 24 Dec 2008 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/KennyQiu/archive/2008/12/24/248038.html</guid><wfw:comment>http://www.blogjava.net/KennyQiu/comments/248038.html</wfw:comment><comments>http://www.blogjava.net/KennyQiu/archive/2008/12/24/248038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/KennyQiu/comments/commentRss/248038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/KennyQiu/services/trackbacks/248038.html</trackback:ping><description><![CDATA[<div class="postTitle">BeanUtils.copyProperties与PropertyUtils.copyProperties用法及区别</div>
<div class="postText"><font face="Verdana" _tempcsstext="null"><strong>一、简介：</strong><br />
BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道，一个JavaBean通常包含了大量的属性，很多情况下，对JavaBean的处理导致大量get/set代码堆积，增加了代码长度和阅读代码的难度。<br />
<br />
<strong>二、用法：</strong><br />
BeanUtils是这个包里比较常用的一个工具类，这里只介绍它的copyProperties()方法。该方法定义如下：
<pre class="overflow" _tempcsstext="null"><font size="3" _tempcsstext="null">public static void copyProperties(java.lang.Object dest,java.lang.Object orig)<br />
throws java.lang.IllegalAccessException,
java.lang.reflect.InvocationTargetException</font></pre>
<p><font size="3">如果你有两个具有很多相同属性的JavaBean，一个很常见的情况就是Struts里的PO对象（持久对象）和对应的ActionForm，例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象，传统的方式是使用类似下面的语句对属性逐个赋值：</font></p>
<font size="3">
<pre class="overflow">//得到TeacherForm<br />
TeacherForm teacherForm=(TeacherForm)form;<br />
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());<br />
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());
//持久化Teacher对象到数据库
HibernateDAO.save(teacher);</pre>
<pre class="overflow">而使用BeanUtils后，代码就大大改观了，如下所示：<br />
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO.save(teacher);</font></pre>
<p><font size="3">如果Teacher和TeacherForm间存在名称不相同的属性，则BeanUtils不对这些属性进行处理，需要程序员手动处理。例如 Teacher包含modifyDate（该属性记录最后修改日期，不需要用户在界面中输入）属性而TeacherForm无此属性，那么在上面代码的 copyProperties()后还要加上一句：</font></p>
<pre class="overflow"><font size="3">teacher.setModifyDate(new Date());</font></pre>
<p><font size="3">怎么样，很方便吧！除BeanUtils外还有一个名为PropertyUtils的工具类，它也提供copyProperties()方法，作用与 BeanUtils的同名方法十分相似，主要的区别在于后者提供类型转换功能，即发现两个JavaBean的同名属性为不同类型时，在支持的数据类型范围内进行转换，而前者不支持这个功能，但是速度会更快一些。BeanUtils支持的转换类型如下：</font></p>
<pre class="overflow"><font size="3">* 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 </font></pre>
<p><font size="3">这里要注意一点，java.util.Date是不被支持的，而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性，且希望被转换的时候，一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。<br />
<br />
<strong>三、优缺点：<br />
</strong><br />
Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我 将说明如何使用BeanUtils将local实体bean转换为对应的value 对象：<br />
</font></p>
<pre class="overflow"><font size="3">BeanUtils.copyProperties(aValue, aLocal)</font></pre>
<p><font size="3">上面的代码从aLocal对象复制属性到aValue对象。它相当简单！它不管local（或对应的value）对象有多少个属性，只管进行复制。我们假设 local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了！太强大了！太有用 了！<br />
<br />
现在，还有一个坏消息：使用BeanUtils的成本惊人地昂贵！我做了一个简单的测试，BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象（通过手动调用get和set方法），以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力！ </font></p>
</font></div>
<img src ="http://www.blogjava.net/KennyQiu/aggbug/248038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/KennyQiu/" target="_blank">KennyQiu</a> 2008-12-24 12:17 <a href="http://www.blogjava.net/KennyQiu/archive/2008/12/24/248038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>