﻿<?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-life-文章分类-java</title><link>http://www.blogjava.net/magibt/category/27985.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 08 Dec 2007 09:12:02 GMT</lastBuildDate><pubDate>Sat, 08 Dec 2007 09:12:02 GMT</pubDate><ttl>60</ttl><item><title>Class与Type的区别与联系</title><link>http://www.blogjava.net/magibt/articles/161288.html</link><dc:creator>Edward's</dc:creator><author>Edward's</author><pubDate>Sat, 17 Nov 2007 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/magibt/articles/161288.html</guid><wfw:comment>http://www.blogjava.net/magibt/comments/161288.html</wfw:comment><comments>http://www.blogjava.net/magibt/articles/161288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/magibt/comments/commentRss/161288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/magibt/services/trackbacks/161288.html</trackback:ping><description><![CDATA[<h4>原作：徐家福</h4> <p>1: 类型的概念 <p>概念：类型刻划了一组值及其上可施行的操作，可理解为值集和操作集构成的二元组。 <p>类型的概念与值的概念相对立，前者是程序中的概念，后者则是程序运行时的概念，两者通过标识值的语言成分（例如，变量、表达式等）联系起来。 <p>比如变量v说明为具有类型T，类型T所刻划的值集为{v<sub>1</sub>，v<sub>2</sub>，&#8230;v<sub>n</sub>，&#8230;}，则变量v运行时能取且只能取某个vi为值。由此可见，类型规定了具有该类型的变量或表达式的取值范围。 <p>2: 类与类型 <p>A: 共性 <p>在对象式语言中，&#8220;值&#8221;为对象（或对象指引，但本质上仍为对象）。所以，对象式语言中的类型刻划了一组对象及其上可施行的操作。类型所刻划的对象称为类型的实例。类也刻划了一组对象。 <p>两者的共性在于二者均刻划了一组对象及其上的操作（在前面关于类的讨论中，并未强调类刻划对象上的操作这一事实），所以，既可以说对象是类型的实例，也可以说对象是类的实例，类型和类在与对象的关系上是相同的。不过，类型欲刻划一组对象及其上的操作，必须借助于类，因为类是达到这种目的的唯一设施。由此可见，类型是以类为基础的，是通过类来定义的，这体现了二者的联系。 <p>B: 区别 <p>l 作用不同 <p>类是程序的构造单位，是描述一组对象及其上操作的唯一语言成分，故其作用主要是具体描述这组对象，提供运行时创建这些对象的&#8220;模板&#8221;。例如，基于类间的继承关系的派生类定义设施就反映了类在描述对象方面的作用。 <p>类型则是标志变量或表达式取值范围的一种语言成分，其作用主要是对这些变量或表达式运行时的取值进行约束。例如，对赋值语句左部的变量和右部的表达式的类型匹配检查就反映了类型的约束作用。 <p>l 与对象联系的紧密程序不同 <p>类描述对象的具体形式和其上可施行的具体操作，且强调所描述的一组对象的共性，因而，与具体对象联系较密切，而与对象集的大小则联系较少。 <p>类型强调所描述的一组对象的范围和可施行操作的范围，与对象集的大小联系较密切，而与其中具体对象则联系较少。 <p>l 并不是所有类都可直接作为类型使用 <p>类是类型的基础，类型靠类来定义，有些类可直接作为类型来使用，在这种意义下，我们也可称这些类是类型。 <p>但是，也有一些类不能直接作为类型来使用，这是因为，从类型的约束作用来看，类型强调所刻划的对象的确定性，即对象范围的确定性。因此，只有所描述的对象的范围确定的类才可直接用作类型。</p>  <img src ="http://www.blogjava.net/magibt/aggbug/161288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/magibt/" target="_blank">Edward's</a> 2007-11-17 22:34 <a href="http://www.blogjava.net/magibt/articles/161288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jakarta-Common-BeanUtils使用笔记</title><link>http://www.blogjava.net/magibt/articles/160583.html</link><dc:creator>Edward's</dc:creator><author>Edward's</author><pubDate>Wed, 14 Nov 2007 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/magibt/articles/160583.html</guid><wfw:comment>http://www.blogjava.net/magibt/comments/160583.html</wfw:comment><comments>http://www.blogjava.net/magibt/articles/160583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/magibt/comments/commentRss/160583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/magibt/services/trackbacks/160583.html</trackback:ping><description><![CDATA[<p> 转自：<a href="http://blog.csdn.net/fanjun/archive/2005/02/17/291662.aspx">http://blog.csdn.net/fanjun/archive/2005/02/17/291662.aspx</a></p> <h4><a name="_Toc93765167"><strong>1.</strong> <strong>概述</strong></a></h4> <p>BeanUtils主要提供了对于JavaBean进行各种操作，  <p>BeanUtils一共分4个包：  <ul> <li>org.apache.commons.beanutils  <li>org.apache.commons.beanutils.converters  <li>org.apache.commons.beanutils.locale  <li>org.apache.commons.beanutils.locale.converters</li></ul> <p>converters 就是专门处理不同传入的 object 该如何转换, locale 呢, 就是为了国际化的处理。其中上面两个是BeanUtils的默认实现，它没有针对本地化的任何处理，这个可以提高执行效率。  <p> <h4><a name="_Toc93765168"><strong>2.</strong> <strong>org.apache.commons.beanutils</strong></a></h4> <p><a name="_Toc93765169"><strong>2.1.</strong><strong>BeanUtil</strong></a></p> <p>1、这个包主要提供用于操作JavaBean的工具类，Jakarta-Common-BeanUtils的主要功能都在这个包里实现。</p> <table cellspacing="0" cellpadding="2" width="750" border="1"> <tbody> <tr> <td valign="top" width="748"> <div class="csharpcode"><pre class="alt"><span class="kwrd">public</span> <span class="kwrd">class</span> Employee {</pre></div>
<div class="csharpcode"><pre>    <span class="kwrd">public</span> Address getAddress(String type);</pre></div>
<div class="csharpcode"><pre class="alt">    <span class="kwrd">public</span> <span class="kwrd">void</span> setAddress(String type, Address address);</pre></div>
<div class="csharpcode"><pre>    <span class="kwrd">public</span> Employee getSubordinate(<span class="kwrd">int</span> index);</pre></div>
<div class="csharpcode"><pre class="alt">    <span class="kwrd">public</span> <span class="kwrd">void</span> setSubordinate(<span class="kwrd">int</span> index, Employee subordinate);</pre></div>
<div class="csharpcode"><pre>    <span class="kwrd">public</span> String getFirstName();</pre></div>
<div class="csharpcode"><pre class="alt">    <span class="kwrd">public</span> <span class="kwrd">void</span> setFirstName(String firstName);</pre></div>
<div class="csharpcode"><pre>    <span class="kwrd">public</span> String getLastName();</pre></div>
<div class="csharpcode"><pre class="alt">    <span class="kwrd">public</span> <span class="kwrd">void</span> setLastName(String lastName);</pre></div>
<div class="csharpcode"><pre>}</pre></div></td></tr></tbody></table>
<p class="csharpcode">&nbsp; <p class="csharpcode">2、BeanUtils可以直接get和set一个属性的值。它将property分成3种类型： 
<ul>
<li>Simple——简单类型，如Stirng、Int&#8230;&#8230; 
<li>Indexed——索引类型，如数组、arrayList&#8230;&#8230; 
<li>Maped——这个不用说也该知道，就是指Map啦，比如HashMap&#8230;&#8230;</li></ul>
<p>访问不同类型的数据可以直接调用函数getProperty和setProperty。它们都只有2个参数，第一个是JavaBean对象，第二个是要操作的属性名。 
<div class="csharpcode">
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748"><pre class="alt">Company c = <span class="kwrd">new</span> Company();</pre><pre>c.setName(<span class="str">"Simple"</span>);</pre></td></tr></tbody></table><pre>对于Simple类型，参数二直接是属性名即可</pre>
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748">
<div class="csharpcode"><pre class="alt"><span class="rem">//Simple</span></pre><pre>    System.<span class="kwrd">out</span>.println(BeanUtils.getProperty(c, <span class="str">"name"</span>));</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</td></tr></tbody></table></div>
<div class="csharpcode">对于Map类型，则需要以&#8220;属性名（key值）&#8221;的形式</div>
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748">
<div class="csharpcode"><pre class="alt"><span class="rem">//Map</span></pre><pre>    System.<span class="kwrd">out</span>.println(BeanUtils.getProperty(c, <span class="str">"address (A2)"</span>));</pre><pre class="alt">    HashMap am = <span class="kwrd">new</span> HashMap();</pre><pre>    am.put(<span class="str">"1"</span>,<span class="str">"234-222-1222211"</span>);</pre><pre class="alt">    am.put(<span class="str">"2"</span>,<span class="str">"021-086-1232323"</span>);</pre><pre>    BeanUtils.setProperty(c,<span class="str">"telephone"</span>,am);</pre><pre class="alt">    System.<span class="kwrd">out</span>.println(BeanUtils.getProperty(c, <span class="str">"telephone (2)"</span>));</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</td></tr></tbody></table>
<div class="csharpcode">对于Indexed，则为&#8220;属性名[索引值]&#8221;，注意这里对于ArrayList和数组都可以用一样的方式进行操作。</div>
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748">
<div class="csharpcode"><pre class="alt"><span class="rem">//index</span></pre><pre>    System.<span class="kwrd">out</span>.println(BeanUtils.getProperty(c, <span class="str">"otherInfo[2]"</span>));</pre><pre class="alt">    BeanUtils.setProperty(c, <span class="str">"product[1]"</span>, <span class="str">"NOTES SERVER"</span>);</pre><pre>    System.<span class="kwrd">out</span>.println(BeanUtils.getProperty(c, <span class="str">"product[1]"</span>));</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</td></tr>
<tr>
<td valign="top" width="748">&nbsp;</td></tr></tbody></table>
<div class="csharpcode">当然这3种类也可以组合使用啦！</div>
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748">
<div class="csharpcode"><pre class="alt"><span class="rem">//nest</span></pre><pre>    System.<span class="kwrd">out</span>.println(BeanUtils.getProperty(c, <span class="str">"employee[1].name"</span>));</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</td></tr></tbody></table>
<div class="csharpcode">&nbsp;</div>
<p>3、此外，还有一个很重要的方法copyProperty，可以直接进行Bean之间的clone。
<div class="csharpcode">
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748">
<div class="csharpcode"><pre class="alt">Company c2 = <span class="kwrd">new</span> Company();</pre><pre>BeanUtils.copyProperties(c2, c);</pre></div></td></tr></tbody></table></div>
<p>但是这种copy都是浅拷贝，复制后的2个Bean的同一个属性可能拥有同一个对象的ref，这个在使用时要小心，特别是对于属性为自定义类的情况。
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>4、最后还有populate，它用于将一个map的值填充到一个bean中
<p><a name="_Toc93765170"><strong>2.2.</strong><strong>LazyDynaBean</strong></a></p>
<p>它实现一个动态的Bean，可以直接往里面加入属性，作为一个JavaBean一样使用，也可以用上面的BeanUtils或get/set方法进行操作，而不用事先定义一个标准的JavaBean类啦：）
<p>记得在J2ee设计模式中有一种Value Object的模式，用于在MVC各层之间传递数据，避免直接传递大业务对象引起的性能问题，为了避免在项目中出现很多Bean类，在书中提供了一个动态Value Object的实现（通过扩展Map）。这里LazyDynaBean则可以作为一种更加成熟、稳定的实现来使用。</p>
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748">
<div class="csharpcode"><pre class="alt"><span class="rem">//这里使用LazyDynaMap，它是LazyBean的一个轻量级实现</span></pre><pre>      LazyDynaMap dynaBean1 = <span class="kwrd">new</span> LazyDynaMap();</pre><pre class="alt">      dynaBean1.set(<span class="str">"foo"</span>, <span class="str">"bar"</span>);                  <span class="rem">// simple</span></pre><pre>      dynaBean1.set(<span class="str">"customer"</span>, <span class="str">"title"</span>, <span class="str">"Mr"</span>);        <span class="rem">// mapped</span></pre><pre class="alt">      dynaBean1.set(<span class="str">"address"</span>, 0, <span class="str">"address1"</span>);         <span class="rem">// indexed</span></pre><pre>      System.<span class="kwrd">out</span>.println(dynaBean1.get(<span class="str">"address"</span>,0));</pre><pre class="alt">      Map myMap = dynaBean1.getMap();           <span class="rem">// retrieve the Map</span></pre><pre>      System.<span class="kwrd">out</span>.println(myMap.toString());</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</td></tr></tbody></table>
<p>上面的例子可以看到，它可以在set时自动增加bean的property（既赋值的同时增加Bean中的property），同时也支持3中类型的property，并且LazyDynaMap还可以导出为map。
<p>对于这个类还有两个重要的Field要注意：</p>
<p>returnnull——指定在get方法使用了一个没有定义过的property时，DynaBean的行为。</p>
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748">
<div class="csharpcode"><pre class="alt"><span class="rem">//取的字段的信息</span></pre><pre>      dynaBean1.setReturnNull(<span class="kwrd">true</span>);<span class="rem">//设为ture。若Bean中没有此字段，返回null</span></pre><pre class="alt">     <span class="rem">//默认为false。若Bean中没有此字段，自动增加一个：）</span></pre><pre>      System.<span class="kwrd">out</span>.println(dynaBean1.get(<span class="str">"aaa"</span>));<span class="rem">//此时返回null</span></pre><pre class="alt">     Restricted——指定是否允许改变这个bean的property。</pre><pre>      <span class="rem">//MutableDynaClass.setRestricted设为true后，字段不可再增删和修改.</span></pre><pre class="alt">     <span class="rem">//默认为false，允许增删和修改</span></pre><pre>      dynaBean1.setRestricted(<span class="kwrd">true</span>);</pre><pre class="alt">&nbsp;&nbsp;&nbsp;&nbsp; dynaBean1.set(<span class="str">"test"</span>,<span class="str">"error"</span>);//这里会出错！</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</td></tr></tbody></table>
<p>通过设置这两个属性，可以防止意外修改DynaBean的property。在设计架构时，你可以在后台从数据表或xml文件自动产生DynaBean，在传到控制层和表示层之前设置上述属性使其Bean结构不允许修改，如此就不可能无意中修改Bean包含的属性&#8230;&#8230;这样既可以享用它的便利，有可以防止由此引入的错误可能，设计者实在深得偷懒的精髓啊！！！！！</p>
<h4><a name="_Toc93765171"><strong>3.</strong> <strong>其他</strong></a></h4>
<p><a name="_Toc93765172"><strong>3.1.</strong><strong>BeanUtils<strong>和PropertyUtils</strong></strong></a></p>
<p>这两个类几乎有一摸一样的功能，唯一的区别是：BeanUtils在对Bean赋值是会进行类型转化。举例来说也就是在copyProperty时只要属性名相同，就算类型不同，BeanUtils也可以进行copy；而PropertyBean则可能会报错！！
<p>针对上面的例子，新建一个Company2的类，其中代码与Company一样，只是将otherinfo从String[]改为String。</p>
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748">
<div class="csharpcode"><pre class="alt">      Company c = init();</pre><pre>      Company2 c2 = <span class="kwrd">new</span> Company2();</pre><pre class="alt">      BeanUtils.copyProperties(c2,c);</pre><pre><span class="rem">//      PropertyUtils.copyProperties(c2,c); 这句会报错！！</span></pre><pre class="alt">      System.<span class="kwrd">out</span>.println(c2.getOtherInfo());</pre></div></td></tr></tbody></table>
<p>当然2个Bean之间的同名属性的类型必须是可以转化的，否则用BeanUtils一样会报错。
<p>若实现了org.apache.commons.beanutils.Converter接口则可以自定义类型之间的转化。
<p>由于不做类型转化，用PropertyUtils在速度上会有很大提高！
<p>此外，不作类型转化还有一个好处，如下面的代码：</p>
<table cellspacing="0" cellpadding="2" width="750" border="1">
<tbody>
<tr>
<td valign="top" width="748">
<div class="csharpcode"><pre class="alt">      <span class="rem">//test data type convert</span></pre><pre><span class="rem">//BeanUtils返回的是String</span></pre><pre class="alt"><span class="rem">//      ArrayList a1 = BeanUtils.getProperty(c,"product"); </span></pre><pre><span class="rem">//取出后直接被转为String</span></pre><pre class="alt">      System.<span class="kwrd">out</span>.println(<span class="str">"--"</span> + BeanUtils.getProperty(c,<span class="str">"product"</span>));     </pre><pre><span class="rem">//PropertyUtils返回的是Object</span></pre><pre class="alt">      ArrayList a = (ArrayList)PropertyUtils.getProperty(c,<span class="str">"product"</span>);</pre><pre>      System.<span class="kwrd">out</span>.println(<span class="str">"--"</span> + a.get(1));</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</td></tr></tbody></table>
<p>用BeanUtils无法返回一个对象（除非自己写一个Converter），它会自动进行类型转化，然后返回String。对于想返回java类或自定义类的话，还是不要老它大驾转化了。</p>
<p><a name="_Toc93765173"><strong>3.2.</strong><strong>Utils<strong>类</strong></strong></a></p>
<p>所有的XXXUtils类都提供的是静态方法，可以直接调用，其主要实现都在相应的XXXUtilsBean中：
<p>BeanUtils ——&gt; BeanUtilsBean
<p>ConvertUtils ——&gt; ConvertUtilsBean
<p>PropertyUtils ——&gt; PropertyUtilsBean
<p>其意思看类名也应该知道的差不多了，我就不再废话啦！当然你也可以直接调用那些XXXUtilsBean，功能都一样！</p>  <img src ="http://www.blogjava.net/magibt/aggbug/160583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/magibt/" target="_blank">Edward's</a> 2007-11-14 16:35 <a href="http://www.blogjava.net/magibt/articles/160583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>