﻿<?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-菠萝三国-文章分类-Java</title><link>http://www.blogjava.net/boluobn/category/24668.html</link><description>大江东去,浪淘尽...</description><language>zh-cn</language><lastBuildDate>Sat, 03 Nov 2007 02:33:24 GMT</lastBuildDate><pubDate>Sat, 03 Nov 2007 02:33:24 GMT</pubDate><ttl>60</ttl><item><title>关于BeanUtils中copyProperties方法的研究体会 (转)</title><link>http://www.blogjava.net/boluobn/articles/157875.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Sat, 03 Nov 2007 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/157875.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/157875.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/157875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/157875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/157875.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">在</span><font face="Times New Roman">Struts</font><span style="font-family: 宋体">中经常看到</span><font face="Times New Roman">BeanUtils.copyProperties</font><span style="font-family: 宋体">这个方法满天飞，特别是在提取表单中的值的时候，但是这个方法具体怎么实现属性的复制却一直不是很明白，特别是在复制属性的时候，比方说把</span><font face="Times New Roman">b</font><span style="font-family: 宋体">复制到</span><font face="Times New Roman">a</font><span style="font-family: 宋体">，</span><font face="Times New Roman">BeanUtils.copyProperties(a,b)</font><span style="font-family: 宋体">，是不是把</span><font face="Times New Roman">b</font><span style="font-family: 宋体">的所有属性都复制过去了呢？如果是同一个属性，</span><font face="Times New Roman">b</font><span style="font-family: 宋体">中的值是不是会覆盖掉</span><font face="Times New Roman">a</font><span style="font-family: 宋体">中的值？这些应该都可以从</span><font face="Times New Roman">BeanUtils</font><span style="font-family: 宋体">的源码中得到答案，奈何找了半天没找到源码，在网上也没有找到别人的答复，于是本着实践是检验真理的唯一标准，决定亲自测试一把，</span><font face="Times New Roman">^_^</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><span style="font-family: 宋体">首先我们构建两个类</span><font face="Times New Roman">People</font><span style="font-family: 宋体">和</span><font face="Times New Roman">Person</font><span style="font-family: 宋体">，它们的实例呆会会用来相互复制。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">People.java</font><span style="font-family: 宋体">：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> com.mangocity.test;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">/**</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@author</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">CMTobby</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*/</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> People {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> People() {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">// </span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">TODO</span></strong><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'"> Auto-generated constructor stub</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">姓名</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">int</span></strong><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">年龄</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">email</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String getEmail() {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">email</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setEmail(String email) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">email</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> = email;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">int</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> getAge() {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setAge(</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">int</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> age) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> = age;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String <span style="background: silver">getName</span>() {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setName(String name) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> = name;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><font size="3"><font face="Times New Roman">Person.java</font><span style="font-family: 宋体">：</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> com.mangocity.test;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">/**</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@author</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">CMTobby</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*/</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Person {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String </span><span style="font-size: 10pt; background: silver; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">int</span></strong><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">address</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String getAddress() {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">address</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setAddress(String address) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">address</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> = address;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">int</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> getAge() {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setAge(</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">int</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> age) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> = age;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String getName() {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; background: silver; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setName(String name) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.</span><span style="font-size: 10pt; background: silver; color: #0000c0; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> = name;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 宋体">接着构建我们的测试类</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> org.apache.commons.beanutils.*;</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> TestBeanUtils {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">/**</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@param</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">args</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*/</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">static</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> main(String[] args) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">// </span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">TODO</span></strong><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'"> Auto-generated method stub</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; People tobby=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> People();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Person cindy=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Person();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobby.setAge(23);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobby.setName(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"CMTobby"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobby.setEmail(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"xiaozhu87487705@163.com"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cindy.setName(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"Cindyelf"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cindy.setAge(24);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">try</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BeanUtils.<em>copyProperties</em>(cindy, tobby);</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">out</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.println(cindy.getName()+</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">":"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+cindy.getAge());</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">catch</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (IllegalAccessException e) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">// </span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">TODO</span></strong><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'"> Auto-generated catch block</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">catch</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (InvocationTargetException e) {</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">// </span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">TODO</span></strong><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'"> Auto-generated catch block</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 宋体">运行该程序输出是：</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">CMTobby:23</span><span style="font-size: 10pt; color: black; font-family: 宋体">。这说明经过</span><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">BeanUtils.<em>copyProperties</em></span><span style="font-size: 10pt; color: black; font-family: 宋体">之后</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">中</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性的值已经被</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tobby</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的同名属性给&#8220;覆盖&#8221;了，至于</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tobby</span><span style="font-size: 10pt; color: black; font-family: 宋体">中有而</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">中没有的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">email</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性有没有复制到</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">中就不得而知了，据我的猜测应该是没有的，因为在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">中没有地方放这个属性啊，而且就算复制过去了，我们如何得到这个值呢？难道用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy.getEmail()</span><span style="font-size: 10pt; color: black; font-family: 宋体">吗，可是</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">根本没有这个方法啊？当然这只是我的猜测，不知哪位达人有准确的答案，欢迎指正，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">^_^</span><span style="font-size: 10pt; color: black; font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 宋体">那么这个复制过程是如何的呢？是直接属性对属性的值拷贝吗，例如</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy.name=tobby.name</span><span style="font-size: 10pt; color: black; font-family: 宋体">？还是老办法，将测试进行到底。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">1.</span><span style="font-size: 10pt; color: black; font-family: 宋体">我将</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Person</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性改名为</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name11</span><span style="font-size: 10pt; color: black; font-family: 宋体">，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性改为</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">age11</span><span style="font-size: 10pt; color: black; font-family: 宋体">，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">get</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">set</span><span style="font-size: 10pt; color: black; font-family: 宋体">方法都做相应的修改，此时运行程序，输出结果为：</span><span style="font-size: 10pt; background: lime; color: black; font-family: 'Courier New'">CMTobby:23</span><span style="font-size: 10pt; color: black; font-family: 宋体">，和前面的一样，由此可以排除值拷贝这个假设了，因为此时</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">中没有了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性而是</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name11</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">2.</span><span style="font-size: 10pt; color: black; font-family: 宋体">我将</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Person</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setName</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setAge</span><span style="font-size: 10pt; color: black; font-family: 宋体">方法分别改为</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setName11</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setAge11.OK</span><span style="font-size: 10pt; color: black; font-family: 宋体">，再次运行我们的程序，这时的输出是：</span><span style="font-size: 10pt; background: lime; color: black; font-family: 'Courier New'">Cindyelf:24</span><span style="font-size: 10pt; color: black; font-family: 宋体">，我们发现</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性的值都没有被覆盖掉，也就是说</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tobby</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的值都没有拷贝过来，为什么呢？</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">3.</span><span style="font-size: 10pt; color: black; font-family: 宋体">将我们程序恢复到刚开始的样子，即上面所贴的代码那样，然后将</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Person</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setAge</span><span style="font-size: 10pt; color: black; font-family: 宋体">方法注释掉，并注释掉</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">TestBeanUtils</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy.setAge(24)</span><span style="font-size: 10pt; color: black; font-family: 宋体">这行代码。运行程序，输出结果是：</span><span style="font-size: 10pt; background: lime; color: black; font-family: 'Courier New'">CMTobby:0</span><span style="font-size: 10pt; color: black; font-family: 宋体">。</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tobby</span><span style="font-size: 10pt; color: black; font-family: 宋体">中</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性的值没有拷贝过来，为什么呢？</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 宋体">基于上述两个测试，我猜测</span><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">BeanUtils.<em>copyProperties</em></span><span style="font-size: 10pt; color: black; font-family: 宋体">的行为过程是这样的：首先通过</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">java</span><span style="font-size: 10pt; color: black; font-family: 宋体">的反射得到</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tobby</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的所有域，然后根据域的名字调用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">中相应的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">set</span><span style="font-size: 10pt; color: black; font-family: 宋体">方法。举个例子，</span><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">BeanUtils</span><span style="font-size: 10pt; color: black; font-family: 宋体">发现</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tobby</span><span style="font-size: 10pt; color: black; font-family: 宋体">中有个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性，那么它会尝试执行</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy.setName()</span><span style="font-size: 10pt; color: black; font-family: 宋体">这个方法。这就很容易解释测试</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">2</span><span style="font-size: 10pt; color: black; font-family: 宋体">和测试</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">3</span><span style="font-size: 10pt; color: black; font-family: 宋体">的结果了：因为</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">中没有了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setName</span><span style="font-size: 10pt; color: black; font-family: 宋体">或者</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setAge(</span><span style="font-size: 10pt; color: black; font-family: 宋体">被改成了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setName11</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setAge11</span><span style="font-size: 10pt; color: black; font-family: 宋体">或者被注释掉了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span><span style="font-size: 10pt; color: black; font-family: 宋体">，所有</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性不会变，仍然是以前的值。而在测试</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: black; font-family: 宋体">中，因为</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">对象有</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setName</span><span style="font-size: 10pt; color: black; font-family: 宋体">方法，所以</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name11</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性的值会被覆盖掉。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 宋体">做完上述测试之后，我闲着无聊又做了如下两个测试：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">4.</span><span style="font-size: 10pt; color: black; font-family: 宋体">将</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Person</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setName</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setAge</span><span style="font-size: 10pt; color: black; font-family: 宋体">改为</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setname</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setage</span><span style="font-size: 10pt; color: black; font-family: 宋体">，程序输出结果是：</span><span style="font-size: 10pt; background: lime; color: black; font-family: 'Courier New'">CMTobby:23</span><span style="font-size: 10pt; color: black; font-family: 宋体">，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">age</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性的值都发生了变化；</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">5.</span><span style="font-size: 10pt; color: black; font-family: 宋体">将</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Person</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setName</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setAge</span><span style="font-size: 10pt; color: black; font-family: 宋体">改为</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setNAme</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setAGe,</span><span style="font-size: 10pt; color: black; font-family: 宋体">程序输出结果是：</span><span style="font-size: 10pt; background: lime; color: black; font-family: 'Courier New'">Cindyelf:24</span><span style="font-size: 10pt; color: black; font-family: 宋体">，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tobby</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的属性的值都没有拷贝过来。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 20pt; text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">基于这两个测试，我想过程会不会是这样的：如果</span><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">BeanUtils</span><span style="font-size: 10pt; color: black; font-family: 宋体">发现</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">tobby</span><span style="font-size: 10pt; color: black; font-family: 宋体">中有个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性，那么它就会尝试执行</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy.setName()</span><span style="font-size: 10pt; color: black; font-family: 宋体">或者</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">cindy.setname()</span><span style="font-size: 10pt; color: black; font-family: 宋体">。当然这些都只是我的推论，仅供参考，所有的答案都会在</span><span style="font-size: 10pt; background: red; color: black; font-family: 'Courier New'">BeanUtils</span><span style="font-size: 10pt; color: black; font-family: 宋体">的源码中找到，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">^_^</span><span style="font-size: 10pt; color: black; font-family: 宋体">，还望哪位达人不吝告知。<br />
<br />
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1703702</span></p>
<img src ="http://www.blogjava.net/boluobn/aggbug/157875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-11-03 09:53 <a href="http://www.blogjava.net/boluobn/articles/157875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java虚拟机（JVM）的动态类加载（Class Loading）</title><link>http://www.blogjava.net/boluobn/articles/153852.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Thu, 18 Oct 2007 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/153852.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/153852.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/153852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/153852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/153852.html</trackback:ping><description><![CDATA[<p style="margin: 0mm 0mm 0pt"><font size="3"><font face="Century">1</font><span style="font-family: SimSun">．介绍</span></font></p>
<p style="margin: 0mm 0mm 0pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class Loaders</font><span style="font-family: SimSun">是动态加载</span><font face="Century">Java</font><span style="font-family: SimSun">类与</span><font face="Century">Resource</font><span style="font-family: SimSun">的一种机制。它支持</span><font face="Century">Laziness</font><span style="font-family: SimSun">，</span><font face="Century">type-safe linkage</font><span style="font-family: SimSun">，</span><font face="Century">user-defined extensibility</font><span style="font-family: SimSun">和</span><font face="Century">multiple communicating namespaces</font><span style="font-family: SimSun">这</span><font face="Century">4</font><span style="font-family: SimSun">种特性。</span></font></p>
<p style="margin: 0mm 0mm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings"><font size="3">l</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size="3"><font face="Century">Lazy loading</font><span style="font-family: SimSun">：</span><font face="Century">Class</font><span style="font-family: SimSun">只有在需要的时候才加载。这样减少了内存使用量，能提高系统反映速度；</span></font></p>
<p style="margin: 0mm 0mm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings"><font size="3">l</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size="3"><font face="Century">Type-safe linkage</font><span style="font-family: SimSun">：动态类加载不会破坏</span><font face="Century">JVM</font><span style="font-family: SimSun">的类型安全；</span></font></p>
<p style="margin: 0mm 0mm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings"><font size="3">l</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size="3"><font face="Century">User-definable class loading policy</font><span style="font-family: SimSun">：开发者可以自定义的类加载器，控制动态类加载过程；</span></font></p>
<p style="margin: 0mm 0mm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings"><font size="3">l</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size="3"><font face="Century">Multiple namespaces</font><span style="font-family: SimSun">：</span><font face="Century">JVM</font><span style="font-family: SimSun">允许使用不同的类加载器加载相同的</span><font face="Century">Class</font><span style="font-family: SimSun">名称，但不同内容的类。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">Class Loaders</font><span style="font-family: SimSun">早在</span><font face="Century">JDK1.0</font><span style="font-family: SimSun">时就已存在，最开始的目的是使</span><font face="Century">HotJava</font><span style="font-family: SimSun">浏览器能加载</span><font face="Century">Applet</font><span style="font-family: SimSun">。从那以后，动态类加载机制被广泛应用到其他方面，例如</span><font face="Century">web application server</font><span style="font-family: SimSun">中</span><font face="Century">Servlets</font><span style="font-family: SimSun">的加载。</span><font face="Century">class loader</font><span style="font-family: SimSun">在</span><font face="Century">JDK 1.0</font><span style="font-family: SimSun">，</span><font face="Century">1.1</font><span style="font-family: SimSun">版本存在的缺陷，已经在</span><font face="Century">JDK 1.2</font><span style="font-family: SimSun">解决，其缺陷主要是编写不正确的</span><font face="Century">Class Loader</font><span style="font-family: SimSun">会造成类型安全问题。</span></font></p>
<p style="margin: 0mm 0mm 0pt"><font size="3"><font face="Century">2</font><span style="font-family: SimSun">．</span><font face="Century">Class Loaders</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">Class Loader</font><span style="font-family: SimSun">的目的是动态加载</span><font face="Century">Java</font><span style="font-family: SimSun">类和</span><font face="Century">Resource</font><span style="font-family: SimSun">。</span><font face="Century">Java</font><span style="font-family: SimSun">类是平台无关的，标准的，具有规范二进制文件格式的。</span><font face="Century">class</font><span style="font-family: SimSun">文件有编译器生成，可以被任何一中</span><font face="Century">JVM</font><span style="font-family: SimSun">加载。</span><font face="Century">Java</font><span style="font-family: SimSun">类的表现形式不仅只有</span><font face="Century">.class</font><span style="font-family: SimSun">文件，还可以为内存</span><font face="Century">buffer</font><span style="font-family: SimSun">，或是网络数据流。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">JVM</font><span style="font-family: SimSun">执行</span><font face="Century">class</font><span style="font-family: SimSun">文件内的</span><font face="Century">Byte code</font><span style="font-family: SimSun">。但是</span><font face="Century">Byte code</font><span style="font-family: SimSun">不是</span><font face="Century">class</font><span style="font-family: SimSun">文件的全部内容，</span><font face="Century">class</font><span style="font-family: SimSun">文件内还包含符号表，表示类，属性和方法名，以及类内引用到其他类，属性，和方法名。例如下面的类</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class C{</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void f(){</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D d=new D();</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: SimSun">类文件内类</span><font face="Century">C</font><span style="font-family: SimSun">引用</span><font face="Century">D</font><span style="font-family: SimSun">。为了能让</span><font face="Century">JVM</font><span style="font-family: SimSun">知道</span><font face="Century">D</font><span style="font-family: SimSun">类是什么，</span><font face="Century">JVM</font><span style="font-family: SimSun">必须要先</span><font face="Century">load D</font><span style="font-family: SimSun">的</span><font face="Century">class file</font><span style="font-family: SimSun">并创建</span><font face="Century">D class</font><span style="font-family: SimSun">对象。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">JVM</font><span style="font-family: SimSun">使用类加载器加载类文件，并创建</span><font face="Century">Class</font><span style="font-family: SimSun">对象。类加载器都是</span><font face="Century">ClassLoader</font><span style="font-family: SimSun">的子类实例。</span><font face="Century">ClassLoader.loadClass</font><span style="font-family: SimSun">方法通过获得一个类名，返回一个</span><font face="Century">Class</font><span style="font-family: SimSun">对象，表示该类的类型。上面的代码里，假设</span><font face="Century">C</font><span style="font-family: SimSun">被类加载器</span><font face="Century">L</font><span style="font-family: SimSun">加载，则</span><font face="Century">L</font><span style="font-family: SimSun">是</span><font face="Century">C</font><span style="font-family: SimSun">的加载器。</span><font face="Century">JVM</font><span style="font-family: SimSun">将使用</span><font face="Century">L</font><span style="font-family: SimSun">加载所有被</span><font face="Century">C</font><span style="font-family: SimSun">引用到的其他</span><font face="Century">Java</font><span style="font-family: SimSun">类。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: SimSun">如果</span><font face="Century">D</font><span style="font-family: SimSun">还没有被加载，</span><font face="Century">L</font><span style="font-family: SimSun">将加载</span><font face="Century">D</font><span style="font-family: SimSun">：</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L.loadClass(&#8220;D&#8221;)</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: SimSun">当</span><font face="Century">D</font><span style="font-family: SimSun">已经被加载，</span><font face="Century">JVM</font><span style="font-family: SimSun">就可以创建</span><font face="Century">D</font><span style="font-family: SimSun">的一个对象实例。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: SimSun">一个</span><font face="Century">Java</font><span style="font-family: SimSun">应用程序可以使用不同类型的类加载器。例如</span><font face="Century">Web Application Server</font><span style="font-family: SimSun">中，</span><font face="Century">Servlet</font><span style="font-family: SimSun">的加载使用开发商自定义的类加载器，</span><font face="Century">java.lang.String</font><span style="font-family: SimSun">在使用</span><font face="Century">JVM</font><span style="font-family: SimSun">系统加载器</span><font face="Century">,Bootstrap Class Loader</font><span style="font-family: SimSun">，开发商定义的其他类则由</span><font face="Century">AppClassLoader</font><span style="font-family: SimSun">加载。在</span><font face="Century">JVM</font><span style="font-family: SimSun">里由类名和类加载器区别不同的</span><font face="Century">Java</font><span style="font-family: SimSun">类型。因此，</span><font face="Century">JVM</font><span style="font-family: SimSun">允许我们使用不同的加载器加载相同</span><font face="Century">namespace</font><span style="font-family: SimSun">的</span><font face="Century">java</font><span style="font-family: SimSun">类，而实际上这些相同</span><font face="Century">namespace</font><span style="font-family: SimSun">的</span><font face="Century">java</font><span style="font-family: SimSun">类可以是完全不同的类。这种机制可以保证</span><font face="Century">JDK</font><span style="font-family: SimSun">自带的</span><font face="Century">java.lang.String</font><span style="font-family: SimSun">是唯一的。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">ClassLoader</font><span style="font-family: SimSun">子类需要重载</span><font face="Century">loadClass</font><span style="font-family: SimSun">方法以实现用户自己的类加载方式，下面是自定义一个类加载器例子：</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">package org.colimas.webapp;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">import java.io.File;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">import java.io.IOException;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">import java.net.URL;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">import java.net.URLClassLoader;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">import java.util.StringTokenizer;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">/**</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;*</font><span style="font-family: SimSun">类加载器加载</span><font face="Century">Servlet</font><span style="font-family: SimSun">，</span><font face="Century">URLClassLoader</font><span style="font-family: SimSun">是</span><font face="Century">ClassLoader</font><span style="font-family: SimSun">的一个子类，可以通过</span><font face="Century">URL</font><span style="font-family: SimSun">加载</span><font face="Century">Java</font><span style="font-family: SimSun">类或其它资源。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;* @author </font><span style="font-family: SimSun">趙磊</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;*</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;*/</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">public class WebAppClassLoader extends URLClassLoader {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; private ClassLoader _parent;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public WebAppClassLoader(ClassLoader parent) {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(new URL[0], parent);</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _parent=parent;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent==null)</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException("no parent classloader!");</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</font><span style="font-family: SimSun">追加一个</span><font face="Century">Class Path</font><span style="font-family: SimSun">。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void addClassPath(String classPath) throws IOException{</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (classPath == null)</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringTokenizer tokenizer= new StringTokenizer(classPath, ",;");</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (tokenizer.hasMoreTokens())</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL url=null;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file=new File(tokenizer.nextToken()).getCanonicalFile();</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url=file.toURI().toURL();&nbsp;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addURL(url);</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</font><span style="font-family: SimSun">加载类</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public synchronized Class loadClass(String name) </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ClassNotFoundException {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return loadClass(name,false);</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected synchronized Class loadClass(String name, boolean resolve) </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ClassNotFoundException {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class c= findLoadedClass(name);</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassNotFoundException ex= null;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (c == null &amp;&amp; _parent!=null ){</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c= _parent.loadClass(name);</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch (ClassNotFoundException e){</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex= e;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (c == null){</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c= this.findSystemClass(name);</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch (ClassNotFoundException e){</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex= e;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (c == null)</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw ex;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (resolve)</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resolveClass(c);</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return c;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">}</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">loadClass</font><span style="font-family: SimSun">方法中使用</span><font face="Century">findLoadedClass</font><span style="font-family: SimSun">方法检查类是否已经被加载。该方法是</span><font face="Century">Native</font><span style="font-family: SimSun">方法，实现在</span><font face="Century">JVM</font><span style="font-family: SimSun">的</span><font face="Century">ClassLoader.c</font><span style="font-family: SimSun">文件内的</span></font><span style="font-size: 10pt; font-family: 'ＭＳ ゴシック'">Java_java_lang_ClassLoader_findLoadedClass</span><span style="font-size: 10pt; font-family: SimSun">函数。如果返回为</span><span style="font-size: 10pt; font-family: SimSun">null</span><span style="font-size: 10pt; font-family: SimSun">，则表示类还没有被加载，于是在其</span><span style="font-size: 10pt; font-family: SimSun">Parent</span><span style="font-size: 10pt; font-family: SimSun">类加载器重寻找</span><font size="3"><font face="Century">_parent.loadClass</font><span style="font-family: SimSun">，如果仍然返回</span><font face="Century">null</font><span style="font-family: SimSun">，则要在系统中查找，</span><font face="Century">findSystemClass</font><span style="font-family: SimSun">，如果仍然没有，则抛出异常。我们要确保多线程在同一时间只能加载一次，因此需要</span><font face="Century">synchronized</font><span style="font-family: SimSun">。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: SimSun">通常我们需要动态更新一个</span><font face="Century">Class</font><span style="font-family: SimSun">。例如一个</span><font face="Century">Servlet</font><span style="font-family: SimSun">实现发生变化时，我们希望不是重启服务器而是</span><font face="Century">Reload</font><span style="font-family: SimSun">。下面的类</span><font face="Century">ServletWrapper</font><span style="font-family: SimSun">提供了一个</span><font face="Century">Servlet Reload</font><span style="font-family: SimSun">的实现方法：</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">package org.colimas.webapp;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">import javax.servlet.Servlet;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">import javax.servlet.ServletConfig;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">import javax.servlet.ServletException;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">/**</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;* @author </font><span style="font-family: SimSun">趙磊</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;*</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;*/</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">public class ServletWrapper {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Servlet theServlet;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; private Class servletClass;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; private ServletConfig config;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; private String _servletname;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; public ServletWrapper(ServletConfig config){</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.config=config;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; public Servlet getServlet() throws ServletException{</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (this) {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destroy();</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><span style="color: red"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WebAppClassLoader loader=new WebAppClassLoader(this.getClass().getClassLoader());</font></font></span></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><span style="color: red"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name=getServletName();</font></font></span></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><span style="color: red"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servletClass = loader.loadClass(name);</font></font></span></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><span style="color: red"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><span style="color: red"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theServlet = (Servlet) servletClass.newInstance();</font></font></span></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch( ClassNotFoundException ex1 ) {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch( InstantiationException ex ) {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(IllegalAccessException ex2){</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red">&nbsp;theServlet.init(config);</font></font></span></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red">return theServlet;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; public void destroy() {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (theServlet != null) {</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theServlet.destroy();</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; </font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; protected String getServletName(){</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _servletname;</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">}</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">getServlet()</font><span style="font-family: SimSun">获得一个</span><font face="Century">Servlet</font><span style="font-family: SimSun">对象。首先创建一个新的</span><font face="Century">Servlet</font><span style="font-family: SimSun">类加载器。</span><span style="color: red"><font face="Century">loader.loadClass</font></span><span style="font-family: SimSun">加载最新的</span><font face="Century">Servlet</font><span style="font-family: SimSun">，</span><span style="color: red"><font face="Century">servletClass.newInstance()</font></span><span style="font-family: SimSun">实例化新的</span><font face="Century">Servlet</font><span style="font-family: SimSun">对象，并</span><span style="color: red"><font face="Century">theServlet.init(config);</font></span><span style="font-family: SimSun">让它运行起来。这种方法只有在不改变</span><font face="Century">Servlet</font><span style="font-family: SimSun">的接口时有效的。如果你要加载的类不实现任何接口，那么就不能在</span><font face="Century">ServletWrapper</font><span style="font-family: SimSun">直接使用该类名。而是定义为</span><font face="Century">Object theServlet</font><span style="font-family: SimSun">，并且</span><span style="color: red"><font face="Century">theServlet = servletClass.newInstance();</font></span><span style="color: red; font-family: SimSun">，</span><span style="font-family: SimSun">而</span><span style="color: red"><font face="Century">theServlet.init(config);</font></span><span style="font-family: SimSun">也不得不改写为：</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">Method m= servletClass.getMethod(&#8220;init&#8221;,&#8230;);</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">m.invoke(theServlet,&#8230;);</font></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><span style="color: red"><font face="Century" size="3">&nbsp;</font></span></p>
<p style="margin: 0mm 0mm 0pt"><font size="3"><font face="Century">3. Type-safe Linkage</font><span style="font-family: SimSun">和</span><font face="Century">Namespace</font><span style="font-family: SimSun">一致性</span></font></p>
<p style="margin: 0mm 0mm 0pt"><font face="Century" size="3">&nbsp;</font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">JVM</font><span style="font-family: SimSun">使用</span><font face="Century">loaded class cache</font><span style="font-family: SimSun">保存</span><font face="Century">class</font><span style="font-family: SimSun">名和加载该</span><font face="Century">class</font><span style="font-family: SimSun">的类加载器。当</span><font face="Century">JVM</font><span style="font-family: SimSun">通过</span><font face="Century">loadClass</font><span style="font-family: SimSun">获得</span><font face="Century">class</font><span style="font-family: SimSun">之后，它执行以下操作：</span></font></p>
<p style="margin: 0mm 0mm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings"><font size="3">l</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size="3"><span style="font-family: SimSun">检查传给</span><font face="Century">loadClass</font><span style="font-family: SimSun">的类名是否和真实类名一致；</span></font></p>
<p style="margin: 0mm 0mm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings"><font size="3">l</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size="3"><span style="font-family: SimSun">如果一致，则保存到</span><font face="Century">loaded class cache</font><span style="font-family: SimSun">里。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><font face="Century">ClassLoader.findLoadedClass</font><span style="font-family: SimSun">就是在</span><font face="Century">loaded class cache</font><span style="font-family: SimSun">查找</span><font face="Century">class</font><span style="font-family: SimSun">是否存在的。</span></font></p>
<p style="margin: 0mm 0mm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: SimSun">为了保证</span><font face="Century">Type-safe</font><span style="font-family: SimSun">，</span><font face="Century">Sun</font><span style="font-family: SimSun">公司做了很多工作，目前也有不止一个解决方案。例如，增加约束规则（</span><font face="Century">Contraint Rule</font><span style="font-family: SimSun">）等。</span></font></p>
<img src ="http://www.blogjava.net/boluobn/aggbug/153852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-10-18 13:20 <a href="http://www.blogjava.net/boluobn/articles/153852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入探讨Java的类加载机制</title><link>http://www.blogjava.net/boluobn/articles/153851.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Thu, 18 Oct 2007 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/153851.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/153851.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/153851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/153851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/153851.html</trackback:ping><description><![CDATA[<div>
<div style="text-indent: 21pt">Java 语言是一种具有动态性的解释型编程语言，当指定程序运行的时候， Java 虚拟机就将编译生成的 . class 文件按照需求和一定的规则加载进内存，并组织成为一个完整的 Java 应用程序。 Java 语言把每个单独的类 Class 和接口 Implements 编译成单独的一个 . class 文件，这些文件对于 Java 运行环境来说就是一个个可以动态加载的单元。正是因为 Java 的这种特性，我们可以在不重新编译其它代码的情况下，只编译需要修改的单元，并把修改文件编译后的 . class 文件放到 Java 的路径当中， 等到下次该 Java 虚拟机器重新激活时，这个逻辑上的 Java 应用程序就会因为加载了新修改的 .class 文件，自己的功能也做了更新，这就是 Java 的动态性。 </div>
<div style="text-indent: 21pt">下面用一个简单的例子让大家对 Java 的动态加载有一个基本的认识： </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">class TestClassA{ </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">public void method(){ </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Loading ClassA");</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">} </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">} </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">public class ClassLoaderTest { </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">public static void main(String args[]){ </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestClassA testClassA = new TestClassA();</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testClassA.method();</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">} </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">} </div>
<div style="text-indent: 21pt">编译后输入命令： java -verbose:class ClassLoaderTest ，执行文件。 </div>
<div style="text-indent: 21pt">输出结构如图 (1) </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt" align="center">图（ 1 ） </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">从运行结果我们可以看到， JRE （ JavaRuntime Environment ）首先加载 ClassLoaderTest 文件，然后再加载 TestClassA 文件，从而实现了动态加载。 </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">&nbsp; </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><strong><span>1． </span></strong><strong>预先加载与依需求加载 </strong></div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">Java 运行环境为了优化系统，提高程序的执行速度，在 JRE 运行的开始会将 Java 运行所需要的基本类采用预先加载（ pre-loading ）的方法全部加载要内存当中，因为这些单元在 Java 程序运行的过程当中经常要使用的，主要包括 JRE 的 rt.jar 文件里面所有的 .class 文件。 </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">当 java.exe 虚拟机开始运行以后，它会找到安装在机器上的 JRE 环境，然后把控制权交给 JRE ， JRE 的类加载器会将 lib 目录下的 rt.jar 基础类别文件库加载进内存，这些文件是 Java 程序执行所必须的，所以系统在开始就将这些文件加载，避免以后的多次 IO 操作，从而提高程序执行效率。 </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">图（ 2 ）我们可以看到多个基础类被加载， java.lang.Object,java.io.Serializable 等等。 </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt" align="center">图（ 2 ） </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">相对于预先加载，我们在程序中需要使用自己定义的类的时候就要使用依需求加载方法（ load-on-demand ），就是在 Java 程序需要用到的时候再加载，以减少内存的消耗，因为 Java 语言的设计初衷就是面向嵌入式领域的。 </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">在这里还有一点需要说明的是， JRE 的依需求加载究竟是在什么时候把类加载进入内部的呢？ </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">我们在定义一个类实例的时候，比如 TestClassA testClassA ，这个时候 testClassA 的值为 null ，也就是说还没有初始化，没有调用 TestClassA 的构造函数，只有当执行 testClassA = new TestClassA() 以后， JRE 才正真把 TestClassA 加载进来。 </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">&nbsp; </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><strong><span>2． </span></strong><strong>隐式加载和显示加载 </strong></div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">Java 的加载方式分为隐式加载（ implicit ）和显示加载（ explicit ），上面的例子中就是用的隐式加载的方式。所谓隐式加载就是我们在程序中用 new 关键字来定义一个实例变量， JRE 在执行到 new 关键字的时候就会把对应的实例类加载进入内存。隐式加载的方法很常见，用的也很多， JRE 系统在后台自动的帮助用户加载，减少了用户的工作量，也增加了系统的安全性和程序的可读性。 </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">相对于隐式加载的就是我们不经常用到的显示加载。所谓显示加载就是有程序员自己写程序把需要的类加载到内存当中，下面我们看一段程序： </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">class TestClass{ </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">public void method(){ </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("TestClass-method");</span> </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">} </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">} </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">&nbsp; </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">public class CLTest { </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">public static void main(String args[]) { </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{</span> </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class c = Class.forName("TestClass");</span> </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestClass object = (TestClass)c.newInstance();</span> </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object.method();</span> </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){</span> </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</span> </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span> </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">} </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">} </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">我们通过 Class 类的 forName (String s) 方法把自定义类 TestClass 加载进来，并通过 newInstance （）方法把实例初始化。事实上 Class 类还很多的功能，这里就不细讲了，有兴趣的可以参考 JDK 文档。 </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">Class 的 forName() 方法还有另外一种形式： Class forName(String s, boolean flag, ClassLoader classloader) ， s 表示需要加载类的名称， flag 表示在调用该函数加载类的时候是否初始化静态区， classloader 表示加载该类所需的加载器。 </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">forName (String s) 是默认通过 ClassLoader.getCallerClassLoader() 调用类加载器的，但是该方法是私有方法，我们无法调用，如果我们想使用 Class forName(String s, boolean flag, ClassLoader classloader) 来加载类的话，就必须要指定类加载器，可以通过如下的方式来实现： </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">Test test = new Test();//Test 类为自定义的一个测试类； </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">ClassLoader cl = test. getClass().getClassLoader(); </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span> 获取 test 的类装载器； </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">Class c = Class.forName("TestClass", true, cl); </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">因为一个类要加载就必需要有加载器，这里我们是通过获取加载 Test 类的加载器 cl 当作加载 TestClass 的类加载器来实现加载的。 </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 21pt">&nbsp; </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><strong><span>3． </span></strong><strong>自定义类加载机制 </strong></div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">之前我们都是调用系统的类加载器来实现加载的，其实我们是可以自己定义类加载器的。利用 Java 提供的 java.net.URLClassLoader 类就可以实现。下面我们看一段范例： </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp; </span>try{ </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL url = new URL("file:/d:/test/lib/");</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URLClassLoader urlCL = new URLClassLoader(new URL[]{url});</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class c = urlCL.loadClass("TestClassA");</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestClassA object = (TestClassA)c.newInstance();</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object.method();</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span> </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">我们通过自定义的类加载器实现了 TestClassA 类的加载并调用 method （）方法。分析一下这个程序：首先定义 URL 指定类加载器从何处加载类， URL 可以指向网际网络上的任何位置，也可以指向我们计算机里的文件系统 ( 包含 JAR 文件 ) 。上述范例当中我们从 file:/d:/test/lib/ 处寻找类；然后定义 URLClassLoader 来加载所需的类，最后即可使用该实例了。 </div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 21pt">&nbsp; </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><strong><span>4． </span></strong><strong>类加载器的阶层体系 </strong></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt">讨论了这么多以后，接下来我们仔细研究一下 Java 的类加载器的工作原理： </div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt">当执行 java ***.class 的时候， java.exe 会帮助我们找到 JRE ，接着找到位于 JRE 内部的 jvm.dll ，这才是真正的 Java 虚拟机器 , 最后加载动态库，激活 Java 虚拟机器。虚拟机器激活以后，会先做一些初始化的动作，比如说读取系统参数等。一旦初始化动作完成之后，就会产生第一个类加载器―― Bootstrap Loader ， Bootstrap Loader 是由 C++ 所撰写而成，这个 Bootstrap Loader 所做的初始工作中，除了一些基本的初始化动作之外，最重要的就是加载 Launcher.java 之中的 ExtClassLoader ，并设定其 Parent 为 null ，代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ，并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是， Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载，所以 Parent 和由哪个类加载器加载没有关系。 </div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt">下面的图形可以表示三者之间的关系： </div>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td style="border-right: rgb(212,208,200); border-top: rgb(212,208,200); border-left: rgb(212,208,200); border-bottom: rgb(212,208,200); background-color: transparent">
            <div>
            <div>父类 </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td style="border-right: rgb(212,208,200); border-top: rgb(212,208,200); border-left: rgb(212,208,200); border-bottom: rgb(212,208,200); background-color: transparent">
            <div>
            <div>父类 </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td style="border-right: rgb(212,208,200); border-top: rgb(212,208,200); border-left: rgb(212,208,200); border-bottom: rgb(212,208,200); background-color: transparent">
            <div>
            <div>载入 </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td style="border-right: rgb(212,208,200); border-top: rgb(212,208,200); border-left: rgb(212,208,200); border-bottom: rgb(212,208,200); background-color: transparent">
            <div>
            <div>载入 </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td style="border-right: rgb(212,208,200); border-top: rgb(212,208,200); border-left: rgb(212,208,200); border-bottom: rgb(212,208,200); background-color: transparent">
            <div>
            <div>BootstrapLoader </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td style="border-right: rgb(212,208,200); border-top: rgb(212,208,200); border-left: rgb(212,208,200); border-bottom: rgb(212,208,200); background-color: transparent">
            <div>
            <div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;PARENT</span> </div>
            <div>AppClassLoader </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td style="border-right: rgb(212,208,200); border-top: rgb(212,208,200); border-left: rgb(212,208,200); border-bottom: rgb(212,208,200); background-color: transparent">
            <div>
            <div>PARENT </div>
            <div>ExtClassLoader </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</span></p>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt">这三个加载器就构成我们的 Java 类加载体系。他们分别从以下的路径寻找程序所需要的类： </div>
<div style="margin: 0cm 0cm 0pt 42pt">BootstrapLoader ： sun.boot.class.path </div>
<div style="margin: 0cm 0cm 0pt 42pt">ExtClassLoader:<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.ext.dirs</span> </div>
<div style="margin: 0cm 0cm 0pt 42pt">AppClassLoader:<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.class.path</span> </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: 24.75pt">这三个系统参量可以通过 System.getProperty() 函数得到具体对应的路径。大家可以自己编程实现查看具体的路径。 </div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt">&nbsp; </div>
<div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><strong><span>5． </span></strong><strong>总结 </strong></div>
<div style="margin: 0cm 0cm 0pt 17.95pt; text-indent: 15.75pt">了解 Java 的类加载机制对我们熟练灵活运用 Java 语言，提高程序的运行效率有着非常重要的作用，知其然也要知其所以然，这样才能从整体提高程序的质量。<br />
<br />
<br />
<strong>以上是个人为了毕业要发表的一篇论文,没有什么深度,下面再继续讨论一点关于ClassLoader的一定东东</strong>:<br />
<br />
public class ClassLoaderTest1{<br />
&nbsp;private ClassLoaderTest2 test = null;<br />
&nbsp;public ClassLoaderTest1(){<br />
&nbsp;&nbsp;test = new ClassLoaderTest2();<br />
&nbsp;}<br />
&nbsp;public void method(){<br />
&nbsp;&nbsp;System.out.println("Loading ClassA");<br />
&nbsp;}<br />
}<br />
<br />
<br />
class ClassLoaderTest2{<br />
&nbsp;public ClassLoaderTest2(){<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;public void method(){<br />
&nbsp;&nbsp;System.out.println("Loading ClassA");<br />
&nbsp;}<br />
}<br />
<br />
测试程序:<br />
&nbsp;URL url = null;<br />
&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;url = new URL("file:/E:/JAVA/MyProject/string/");<br />
&nbsp;&nbsp;} catch (MalformedURLException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;URLClassLoader cl = new URLClassLoader(new URL[]{url});<br />
&nbsp;&nbsp;URLClassLoader cl1 = new URLClassLoader(new URL[]{url});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;Class tempClass = cl.loadClass("ClassLoaderTest1");<br />
&nbsp;&nbsp;&nbsp;Class tempClass2 = cl.loadClass("ClassLoaderTest2");<br />
&nbsp;&nbsp;&nbsp;Object test = tempClass.newInstance();<br />
&nbsp;&nbsp;&nbsp;System.out.println(tempClass.getClassLoader());<br />
&nbsp;&nbsp;&nbsp;System.out.println(tempClass2.getClassLoader());<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
<br />
当ClassLoaderTest1,ClassLoaderTest2在当前目录和E:/JAVA/MyProject/string/都存在的时候输出为<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#117;&#110;&#46;&#109;&#105;&#115;&#99;&#46;&#76;&#97;&#117;&#110;&#99;&#104;&#101;&#114;&#36;&#65;&#112;&#112;&#67;&#108;&#97;&#115;&#115;&#76;&#111;&#97;&#100;&#101;&#114;&#64;&#49;&#48;&#53;&#48;&#49;&#54;&#57;">sun.misc.Launcher$AppClassLoader@1050169</a><br />
&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#117;&#110;&#46;&#109;&#105;&#115;&#99;&#46;&#76;&#97;&#117;&#110;&#99;&#104;&#101;&#114;&#36;&#65;&#112;&#112;&#67;&#108;&#97;&#115;&#115;&#76;&#111;&#97;&#100;&#101;&#114;&#64;&#49;&#48;&#53;&#48;&#49;&#54;&#57;">sun.misc.Launcher$AppClassLoader@1050169</a><br />
即都是被<u>AppClassLoader加载的, 即使在</u>E:/JAVA/MyProject/string/下面也存在.<br />
<br />
当ClassLoaderTest1,ClassLoaderTest2只在E:/JAVA/MyProject/string/下存在的时候输出为<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#97;&#118;&#97;&#46;&#110;&#101;&#116;&#46;&#85;&#82;&#76;&#67;&#108;&#97;&#115;&#115;&#76;&#111;&#97;&#100;&#101;&#114;&#64;&#52;&#56;&#48;&#52;&#53;&#55;"><font color="#000000">java.net.URLClassLoader@480457</font> </a><br />
java.net.URLClassLoader@1a7bf11<br />
即都是被自定义的加载器加载的,并且也可以Object test = tempClass.newInstance();<br />
<br />
下面一的是最关键的,因为ClassLoaderTest1需要用到ClassLoaderTest2,如果ClassLoaderTest2被AppClassLoader加载,而ClassLoaderTest1是被自定义的类加载器加载,就会出现如下错误:<br />
<br />
java.lang.IllegalAccessError: tried to access class ClassLoaderTest2 from class ClassLoaderTest1<br />
&nbsp;at ClassLoaderTest1.&lt;init&gt;(ClassLoaderTest1.java:6)<br />
&nbsp;at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)<br />
&nbsp;at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)<br />
&nbsp;at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)<br />
&nbsp;at java.lang.reflect.Constructor.newInstance(Constructor.java:274)<br />
&nbsp;at java.lang.Class.newInstance0(Class.java:308)<br />
&nbsp;at java.lang.Class.newInstance(Class.java:261)<br />
&nbsp;at ClassLoaderTest.main(ClassLoaderTest.java:43)<br />
<br />
<br />
<strong>所以JVM在寻找类的时候,不仅仅是根据类的名称,而是根据类明和类的加载器一起来决定的</strong></div>
</div>
<img src ="http://www.blogjava.net/boluobn/aggbug/153851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-10-18 13:18 <a href="http://www.blogjava.net/boluobn/articles/153851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java实现精确的"四舍五入"</title><link>http://www.blogjava.net/boluobn/articles/134785.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 06 Aug 2007 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134785.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134785.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134785.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134785.html</trackback:ping><description><![CDATA[<strong><br></strong>
<p>importjava.math.BigDecimal;<br>publicclassArith<br>{<br>&nbsp;privatestaticfinalintDEF_DIV_SCALE=10;</p>
<p>&nbsp;&nbsp;privateArith()<br>&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p><br>&nbsp;&nbsp;&nbsp;/**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*提供精确的加法运算。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv1被加数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv2加数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@return两个参数的和</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp;publicstaticdoubleadd(doublev1,doublev2)<br>&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimalb1=newBigDecimal(Double.toString(v1));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimalb2=newBigDecimal(Double.toString(v2));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnb1.add(b2).doubleValue();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;/**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*提供精确的减法运算。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv1被减数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv2减数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@return两个参数的差</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp;publicstaticdoublesub(doublev1,doublev2)<br>&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimalb1=newBigDecimal(Double.toString(v1));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimalb2=newBigDecimal(Double.toString(v2));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnb1.subtract(b2).doubleValue();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p><br>&nbsp;/**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*提供精确的乘法运算。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv1被乘数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv2乘数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@return两个参数的积</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp;publicstaticdoublemul(doublev1,doublev2)<br>&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;BigDecimalb1=newBigDecimal(Double.toString(v1));</p>
<p>&nbsp;&nbsp;BigDecimalb2=newBigDecimal(Double.toString(v2));</p>
<p>&nbsp;&nbsp;returnb1.multiply(b2).doubleValue();</p>
<p>&nbsp;&nbsp;}</p>
<p>&nbsp;<br>&nbsp;/**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*提供（相对）精确的除法运算，当发生除不尽的情况时，精确到</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*小数点以后10位，以后的数字四舍五入。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv1被除数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv2除数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@return两个参数的商</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp;publicstaticdoublediv(doublev1,doublev2)<br>&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returndiv(v1,v2,DEF_DIV_SCALE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;/**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*定精度，以后的数字四舍五入。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv1被除数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv2除数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramscale表示表示需要精确到小数点以后几位。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@return两个参数的商</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp;publicstaticdoublediv(doublev1,doublev2,intscale)<br>&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;if(scale&lt;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;thrownewIllegalArgumentException("Thescalemustbeapositiveintegerorzero");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimalb1=newBigDecimal(Double.toString(v1));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimalb2=newBigDecimal(Double.toString(v2));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnb1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;/**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*提供精确的小数位四舍五入处理。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramv需要四舍五入的数字</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@paramscale小数点后保留几位</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*@return四舍五入后的结果</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp;publicstaticdoubleround(doublev,intscale){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(scale&lt;0)<br>&nbsp;&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thrownewIllegalArgumentException("Thescalemustbeapositiveintegerorzero");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimalb=newBigDecimal(Double.toString(v));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimalone=newBigDecimal("1");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnb.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();</p>
<p>&nbsp;&nbsp;&nbsp;}</p>
<p><br>}<br></p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-06 21:33 <a href="http://www.blogjava.net/boluobn/articles/134785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>