﻿<?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-&lt;b&gt;成都心情&lt;/b&gt;-随笔分类-Java 基础</title><link>http://www.blogjava.net/rosen/category/2690.html</link><description>努力和牛人缩短差距。</description><language>zh-cn</language><lastBuildDate>Tue, 22 Jun 2010 22:02:04 GMT</lastBuildDate><pubDate>Tue, 22 Jun 2010 22:02:04 GMT</pubDate><ttl>60</ttl><item><title>使用SoftReference软引用</title><link>http://www.blogjava.net/rosen/archive/2010/06/22/324173.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Tue, 22 Jun 2010 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2010/06/22/324173.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/324173.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2010/06/22/324173.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/324173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/324173.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 还是做个实际的SoftReference测试吧。&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2010/06/22/324173.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/324173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2010-06-22 15:27 <a href="http://www.blogjava.net/rosen/archive/2010/06/22/324173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Memory Analyzer tool(MAT)分析内存泄漏（二）</title><link>http://www.blogjava.net/rosen/archive/2010/06/13/323522.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Sun, 13 Jun 2010 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2010/06/13/323522.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/323522.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2010/06/13/323522.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/323522.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/323522.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在平时工作过程中，有时会遇到OutOfMemoryError，我们知道遇到Error一般表明程序存在着严重问题，可能是灾难性的。所以找出是什么原因造成OutOfMemoryError非常重要。现在向大家引荐Eclipse Memory Analyzer tool(MAT)，来化解我们遇到的难题。&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2010/06/13/323522.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/323522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2010-06-13 16:13 <a href="http://www.blogjava.net/rosen/archive/2010/06/13/323522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Memory Analyzer tool(MAT)分析内存泄漏（一）</title><link>http://www.blogjava.net/rosen/archive/2010/05/21/321575.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 21 May 2010 12:59:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2010/05/21/321575.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/321575.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2010/05/21/321575.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/321575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/321575.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在平时工作过程中，有时会遇到OutOfMemoryError，我们知道遇到Error一般表明程序存在着严重问题，可能是灾难性的。所以找出是什么原因造成OutOfMemoryError非常重要。现在向大家引荐Eclipse Memory Analyzer tool(MAT)，来化解我们遇到的难题。&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2010/05/21/321575.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/321575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2010-05-21 20:59 <a href="http://www.blogjava.net/rosen/archive/2010/05/21/321575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VSS Plugin配置FAQ（翻译）</title><link>http://www.blogjava.net/rosen/archive/2007/10/26/156286.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 26 Oct 2007 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2007/10/26/156286.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/156286.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2007/10/26/156286.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/156286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/156286.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前言（译者）																																																														 												就个人的成长历程来说，刚参加工作用的是				CVS				，前前后后有接近三年的使用体验，从今年开始使用				SVN				。总的来说我更喜欢				...&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2007/10/26/156286.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/156286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2007-10-26 23:43 <a href="http://www.blogjava.net/rosen/archive/2007/10/26/156286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jakarta-ORO 分解 IP 地址</title><link>http://www.blogjava.net/rosen/archive/2005/10/25/16729.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Tue, 25 Oct 2005 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/10/25/16729.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/16729.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/10/25/16729.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/16729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/16729.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 前几天就在着手写本文了。情景是这样的，一个“192.168.0.1”的 IP 地址，按照“.”标志分解成四段，考虑片刻打算以 Jakarta-ORO 实现。<BR>&nbsp;&nbsp;&nbsp; 但是写着写着，发现用 String.split(String arg0) 方法也可以实现需求。遂陷入了迷茫，而后转念一想，鸡肋就鸡肋吧，说不定下次会在其他地方用到。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 先来看看 String.split(String arg0) 是如何实现的，下面是最想当然的写法：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;SplitTest&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(&nbsp;String[]&nbsp;args&nbsp;){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ip&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">192.168.0.1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;ips&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;ip.split(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ips.length);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV><BR>&nbsp;&nbsp;&nbsp; 嗯，测试以后，控制台打印出“0”，那这样一来 String.split(String arg0) 岂不是不能实现需求咯？且慢，我们如果加上转义符会怎样呢？<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;SplitTest&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(&nbsp;String[]&nbsp;args&nbsp;){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ip&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">192.168.0.1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;ips&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;ip.split(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\\.</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ips.length);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV><BR>&nbsp;&nbsp;&nbsp; 这次终于如愿以偿了，控制台打印出“4”。至于为什么会这样，我也没有深入探索，和朋友交流后大概是说“.”在 Java 中有特殊含义，如果要进行正则匹配，就必须转义一下。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 转入 Jakarta-ORO，下面看看它是如何进行匹配的：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.oro.text.regex.MalformedPatternException;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.oro.text.regex.MatchResult;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.oro.text.regex.Pattern;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.oro.text.regex.PatternCompiler;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.oro.text.regex.PatternMatcher;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.oro.text.regex.Perl5Compiler;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">&nbsp;org.apache.oro.text.regex.Perl5Matcher;<BR><BR></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;SplitTest&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(&nbsp;String[]&nbsp;args&nbsp;)&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throws</SPAN><SPAN style="COLOR: #000000">&nbsp;MalformedPatternException{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ip&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">192.168.0.1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PatternCompiler&nbsp;pc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Perl5Compiler();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PatternMatcher&nbsp;pm&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Perl5Matcher();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;pattern&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pc<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.compile(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pm.contains(ip,&nbsp;pattern);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatchResult&nbsp;mr&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pm.getMatch();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;ip0&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Integer.parseInt(mr.group(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;ip1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Integer.parseInt(mr.group(</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;ip2&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Integer.parseInt(mr.group(</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;ip3&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Integer.parseInt(mr.group(</SPAN><SPAN style="COLOR: #000000">4</SPAN><SPAN style="COLOR: #000000">));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ip0</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">ip1</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">ip2</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">ip3);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV><BR><BR>&nbsp;&nbsp;&nbsp; 关于 Jakarta-ORO 更多的信息，网上一搜一大堆，在此就不进行细致的代码解释了。<BR><BR><BR><BR><STRONG><FONT color=#ff0000 size=2>请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</FONT></STRONG><A HREF="/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A><img src ="http://www.blogjava.net/rosen/aggbug/16729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-10-25 11:17 <a href="http://www.blogjava.net/rosen/archive/2005/10/25/16729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用反射从 XML 构造 VO</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9974.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9974.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9974.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9974.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;&nbsp;&nbsp;&nbsp; 反射使您的程序代码能够接入装载到 JVM 中的类的内部信息，允许你编写与执行时，而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 首先观察下面的 XML 文件： 
<P>
<TABLE style="WIDTH: 413px; HEIGHT: 23px" cellSpacing=1 cellPadding=1 width=413 border=1>
<TBODY>
<TR>
<TD><FONT size=2>&nbsp;&lt;?xml version = '1.0' encoding = 'gb2312'?&gt;<BR>&lt;ROOT&gt;<BR>&nbsp;&nbsp; &lt;ARSUBITEM num="1"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;C_ITEMNO&gt;300200500009&lt;/C_ITEMNO&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;C_ITEMNAME&gt;20050112测试&lt;/C_ITEMNAME&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;C_SUBITEMNO&gt;200543030000010&lt;/C_SUBITEMNO&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;C_SUBITEMNAME&gt;20010112标段2&lt;/C_SUBITEMNAME&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;C_FUNCNAME&gt;监督备案&lt;/C_FUNCNAME&gt;<BR>&nbsp;&nbsp; &lt;/ARSUBITEM&gt;<BR>&lt;/ROOT&gt;</FONT></TD></TR></TBODY></TABLE></P>
<P>&nbsp;&nbsp;&nbsp; 该 XML 文件描述了一个标段当前流程信息，接下来把它翻译成 VO ：</P>
<P>
<TABLE style="WIDTH: 413px; HEIGHT: 23px" cellSpacing=1 cellPadding=1 width=413 border=1>
<TBODY>
<TR>
<TD>
<P><FONT size=1>&nbsp;</FONT><FONT size=2>public class BidProcess implements Serializable{</FONT></P>
<P><FONT size=2>&nbsp;private String itemNo;<BR>&nbsp;private String itemName;<BR>&nbsp;private String subItemNo;<BR>&nbsp;private String subItemName;<BR>&nbsp;private String functionName;</FONT></P>
<P><FONT size=2>&nbsp;/**<BR>&nbsp; * @return 返回 functionName。<BR>&nbsp; */<BR>&nbsp;public String getFunctionName() {<BR>&nbsp;&nbsp;return functionName;<BR>&nbsp;}<BR>&nbsp;/**<BR>&nbsp; * @param functionName 要设置的 functionName。<BR>&nbsp; */<BR>&nbsp;public void setFunctionName(String functionName) {<BR>&nbsp;&nbsp;this.functionName = functionName;<BR>&nbsp;}<BR>&nbsp;/**<BR>&nbsp; * @return 返回 itemName。<BR>&nbsp; */<BR>&nbsp;public String getItemName() {<BR>&nbsp;&nbsp;return itemName;<BR>&nbsp;}<BR>&nbsp;/**<BR>&nbsp; * @param itemName 要设置的 itemName。<BR>&nbsp; */<BR>&nbsp;public void setItemName(String itemName) {<BR>&nbsp;&nbsp;this.itemName = itemName;<BR>&nbsp;}<BR>&nbsp;/**<BR>&nbsp; * @return 返回 itemNo。<BR>&nbsp; */<BR>&nbsp;public String getItemNo() {<BR>&nbsp;&nbsp;return itemNo;<BR>&nbsp;}<BR>&nbsp;/**<BR>&nbsp; * @param itemNo 要设置的 itemNo。<BR>&nbsp; */<BR>&nbsp;public void setItemNo(String itemNo) {<BR>&nbsp;&nbsp;this.itemNo = itemNo;<BR>&nbsp;}<BR>&nbsp;/**<BR>&nbsp; * @return 返回 subItemName。<BR>&nbsp; */<BR>&nbsp;public String getSubItemName() {<BR>&nbsp;&nbsp;return subItemName;<BR>&nbsp;}<BR>&nbsp;/**<BR>&nbsp; * @param subItemName 要设置的 subItemName。<BR>&nbsp; */<BR>&nbsp;public void setSubItemName(String subItemName) {<BR>&nbsp;&nbsp;this.subItemName = subItemName;<BR>&nbsp;}<BR>&nbsp;/**<BR>&nbsp; * @return 返回 subItemNo。<BR>&nbsp; */<BR>&nbsp;public String getSubItemNo() {<BR>&nbsp;&nbsp;return subItemNo;<BR>&nbsp;}<BR>&nbsp;/**<BR>&nbsp; * @param subItemNo 要设置的 subItemNo。<BR>&nbsp; */<BR>&nbsp;public void setSubItemNo(String subItemNo) {<BR>&nbsp;&nbsp;this.subItemNo = subItemNo;<BR>&nbsp;}<BR>}</FONT></P></TD></TR></TBODY></TABLE></P>
<P>&nbsp;&nbsp;&nbsp; 从 XML 构造 VO ，放入 List 中，代码如下：</P>
<P>
<TABLE style="WIDTH: 412px; HEIGHT: 23px" cellSpacing=1 cellPadding=1 width=412 border=1>
<TBODY>
<TR>
<TD>
<P><FONT size=2>&nbsp;public class VOFactory {</FONT></P>
<P><FONT size=2>&nbsp;//&nbsp;构造出的对象集合<BR>&nbsp;private ArrayList list=new ArrayList();<BR>&nbsp;<BR>&nbsp;/** 利用反射获取结果集&nbsp; */<BR>&nbsp;public List parse(Serializable source, String xml){<BR>&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;//构造 XML 输入流<BR>&nbsp;&nbsp;&nbsp;ByteArrayInputStream ba=new ByteArrayInputStream(xml.getBytes());<BR>&nbsp;&nbsp;&nbsp;//Dom4J 初始化<BR>&nbsp;&nbsp;&nbsp;SAXReader reader = new SAXReader();<BR>&nbsp;&nbsp;&nbsp;Document document = reader.read(ba);<BR>&nbsp;&nbsp;&nbsp;Element root = document.getRootElement();<BR>&nbsp;&nbsp;&nbsp;//获得类对象<BR>&nbsp;&nbsp;&nbsp;Class c = source.getClass();<BR>&nbsp;&nbsp;&nbsp;//获得构造函数<BR>&nbsp;&nbsp;&nbsp;Constructor[] cons=c.getDeclaredConstructors();<BR>&nbsp;&nbsp;&nbsp;Constructor con=cons[0];<BR>&nbsp;&nbsp;&nbsp;//获得类中的字段<BR>&nbsp;&nbsp;&nbsp;Field[] fields = c.getDeclaredFields();<BR>&nbsp;&nbsp;&nbsp;//设置访问private字段的权限<BR>&nbsp;&nbsp;&nbsp;AccessibleObject.setAccessible(fields,true);<BR>&nbsp;&nbsp;&nbsp;//以特定名称获得 XML 元素列表<BR>&nbsp;&nbsp;&nbsp;List lis = root.elements("ARSUBITEM");<BR>&nbsp;&nbsp;&nbsp;//"ARSUBITEM"元素下的子元素<BR>&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;lis.size();i++){<BR>&nbsp;&nbsp;&nbsp;&nbsp;Element element=(Element)lis.get(i);<BR>&nbsp;&nbsp;&nbsp;&nbsp;Iterator iter=element.elementIterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;//从构造函数实例化对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;Serializable localObj=(Serializable)con.newInstance(null);<BR>&nbsp;&nbsp;&nbsp;&nbsp;//按照字段个数循环<BR>&nbsp;&nbsp;&nbsp;&nbsp;int j=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(iter.hasNext()){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element e=(Element)iter.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fields[j].set(localObj,e.getText());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;list.add(localObj);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return list;<BR>&nbsp;}<BR>}</FONT></P></TD></TR></TBODY></TABLE></P>
<P>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; &nbsp;通过对以上代码原形进行修改，可实现分页、结果集嵌套等需求。在写作本文时，我偶然发现了 Jakarta Commons BeanUtils 也提供了类似的功能。那么本文就作为一个了解反射的范例罢了。<BR><BR><BR><STRONG><FONT color=#ff0000 size=2>请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</FONT></STRONG><A href="http://www.blogjava.net/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A></P></SPAN><img src ="http://www.blogjava.net/rosen/aggbug/9974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 16:57 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 短路运算符和非短路运算符</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9956.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9956.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9956.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9956.html</trackback:ping><description><![CDATA[短路运算符就是我们常用的“&amp;&amp;”、“||”，一般称为“条件操作”。 
<p></p><table style="WIDTH: 528px; HEIGHT: 162px" height="162" cellspacing="0" cellpadding="0" width="528" border="1"><tbody><tr><td><font size="2">class Logic{<br />    public ststic void main(String[] args){<br />        int a=1;<br />        int b=1;<br />        if(a&lt;b &amp;&amp; b&lt;a/0){<br />            System.out.println("Oh，That's Impossible!!!");<br />        }else{<br />            System.out.println("That's in my control.");<br />        }<br />    }<br />}</font></td></tr></tbody></table><br />    “&amp;&amp;”运算符检查第一个表达式是否返回“false”，如果是“false”则结果必为“false”，不再检查其他内容。<br />“a/0”是个明显的错误！但短路运算“&amp;&amp;”先判断“a&lt;b”，返回“false”，遂造成短路，也就不进行“a/0”操作了，程序会打出"That's in my control."。这个时候，交换一下“&amp;&amp;”左右两边的表达式，程序立即抛出异常“java.lang.ArithmeticException: / by zero”。<p></p><table style="WIDTH: 527px; HEIGHT: 100px" height="100" cellspacing="0" cellpadding="0" width="527" border="1"><tbody><tr><td><p><font size="2">class Logic{<br />    public ststic void main(String[] args){<br />        int a=1;<br />        int b=1;<br />        if(a==b || b&lt;a/0){<br />            System.out.println("That's in my control.");<br />        }else{<br />            System.out.println("Oh，That's Impossible!!!");<br />        }<br />    }<br />}</font></p></td></tr></tbody></table><br />    “||”运算符检查第一个表达式是否返回“true”，如果是“true”则结果必为“true”，不再检查其他内容。<br />“a/0”是个明显的错误！但短路运算“||”先执行“a==b”判断，返回“true”，遂造成短路，也就不进行“a/0”操作了，程序会打出"That's in my control."。这个时候，交换一下“||”左右两边的表达式，程序立即抛出异常“java.lang.ArithmeticException: / by zero”。<p><br />非短路运算符包括 “&amp; 与”、“| 或”、“^ 异或”，一般称为“逻辑操作”</p><p></p><table style="WIDTH: 525px; HEIGHT: 176px" height="176" cellspacing="0" cellpadding="0" width="525" border="1"><tbody><tr><td><p><font size="2">class Logic{<br />    public ststic void main(String[] args){<br />        int a=1;<br />        int b=1;<br />        if(a&lt;b &amp; b&lt;a/0){<br />            System.out.println("Oh，That's Impossible!!!");<br />        }else{<br />            System.out.println("That's in my control.");<br />        }<br />    }<br />}</font></p></td></tr></tbody></table><br />    “&amp;”运算符不会造成短路，它会认认真真的检查每一个表达式，虽然“a&lt;b”已经返回“flase”了，它还是会继续检查其他内容，以至于最终抛出异常“java.lang.ArithmeticException: / by zero”。<br />    <br /><table style="WIDTH: 522px; HEIGHT: 164px" height="164" cellspacing="0" cellpadding="0" width="522" border="1"><tbody><tr><td><font size="2">class Logic{<br />    public ststic void main(String[] args){<br />        int a=1;<br />        int b=1;<br />        if(a==b | b&lt;a/0){<br />            System.out.println("That's in my control.");<br />        }else{<br />            System.out.println("Oh，That's Impossible!!!");<br />        }<br />    }<br />}</font></td></tr></tbody></table><br />    同理，“|”运算符也不会造成短路，虽然“a==b”已经返回“true”了，它还是会继续检查其他内容，以至于最终抛出异常“java.lang.ArithmeticException: / by zero”。<p>    “^”运算符道理是一样的，就不在这里罗索了。</p><p>    最后。短路运算符只能用于逻辑表达式内，非短路运算符可用于位表达式和逻辑表达式内。也可以说：短路运算只能操作布尔型的，而非短路运算不仅可以操作布尔型，而且可以操作数值型。<br /><br /><br /><strong><font color="#ff0000" size="2">请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</font></strong><a href="/rosen"><font face="宋体" color="#ff0000" size="2"><strong>http://www.blogjava.net/rosen</strong></font></a></p><img src ="http://www.blogjava.net/rosen/aggbug/9956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:46 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 中的位运算</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9955.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9955.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9955.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9955.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9955.html</trackback:ping><description><![CDATA[
		<p>
				<strong>移位运算符</strong>
		</p>
		<p>    包括：<br />    “&gt;&gt; 右移”；“&lt;&lt; 左移”；“&gt;&gt;&gt; 无符号右移”</p>
		<p>例子：<br />-5&gt;&gt;3=-1<br />1111 1111 1111 1111 1111 1111 1111 1011<br />1111 1111 1111 1111 1111 1111 1111 1111<br />其结果与 Math.floor((double)-5/(2*2*2)) 完全相同。</p>
		<p>-5&lt;&lt;3=-40<br />1111 1111 1111 1111 1111 1111 1111 1011<br />1111 1111 1111 1111 1111 1111 1101 1000 <br />其结果与 -5*2*2*2 完全相同。</p>
		<p>5&gt;&gt;3=0<br />0000 0000 0000 0000 0000 0000 0000 0101<br />0000 0000 0000 0000 0000 0000 0000 0000<br />其结果与 5/(2*2*2) 完全相同。</p>
		<p>5&lt;&lt;3=40<br />0000 0000 0000 0000 0000 0000 0000 0101<br />0000 0000 0000 0000 0000 0000 0010 1000<br />其结果与 5*2*2*2 完全相同。</p>
		<p>-5&gt;&gt;&gt;3=536870911      <br />1111 1111 1111 1111 1111 1111 1111 1011<br />0001 1111 1111 1111 1111 1111 1111 1111</p>
		<p>无论正数、负数，它们的右移、左移、无符号右移 32 位都是其本身，比如 -5&lt;&lt;32=-5、-5&gt;&gt;32=-5、-5&gt;&gt;&gt;32=-5。<br />一个有趣的现象是，把 1 左移 31 位再右移 31 位，其结果为 -1。<br />0000 0000 0000 0000 0000 0000 0000 0001<br />1000 0000 0000 0000 0000 0000 0000 0000<br />1111 1111 1111 1111 1111 1111 1111 1111</p>
		<p>
				<strong>
						<br />位逻辑运算符</strong>
		</p>
		<p>    包括：<br />    &amp; 与；| 或；~ 非（也叫做求反）；^ 异或</p>
		<p>    “&amp; 与”、“| 或”、“~ 非”是基本逻辑运算，由此可以演变出“与非”、“或非”、“与或非”复合逻辑运算。“^ 异或”是一种特殊的逻辑运算，对它求反可以得到“同或”，所以“同或”逻辑也叫“异或非”逻辑。</p>
		<p>例子：<br />5&amp;3=1<br />0000 0000 0000 0000 0000 0000 0000 0101<br />0000 0000 0000 0000 0000 0000 0000 0011<br />0000 0000 0000 0000 0000 0000 0000 0001</p>
		<p>-5&amp;3=3<br />1111 1111 1111 1111 1111 1111 1111 1011<br />0000 0000 0000 0000 0000 0000 0000 0011<br />0000 0000 0000 0000 0000 0000 0000 0011</p>
		<p>5|3=7<br />0000 0000 0000 0000 0000 0000 0000 0101<br />0000 0000 0000 0000 0000 0000 0000 0011<br />0000 0000 0000 0000 0000 0000 0000 0111</p>
		<p>-5|3=-5<br />1111 1111 1111 1111 1111 1111 1111 1011<br />0000 0000 0000 0000 0000 0000 0000 0011<br />1111 1111 1111 1111 1111 1111 1111 1011</p>
		<p>~5=-6<br />0000 0000 0000 0000 0000 0000 0000 0101<br />1111 1111 1111 1111 1111 1111 1111 1010</p>
		<p>~-5=4<br />1111 1111 1111 1111 1111 1111 1111 1011<br />0000 0000 0000 0000 0000 0000 0000 0100</p>
		<p>5^3=6<br />0000 0000 0000 0000 0000 0000 0000 0101<br />0000 0000 0000 0000 0000 0000 0000 0011<br />0000 0000 0000 0000 0000 0000 0000 0110</p>
		<p>-5^3=-8<br />1111 1111 1111 1111 1111 1111 1111 1011<br />0000 0000 0000 0000 0000 0000 0000 0011<br />1111 1111 1111 1111 1111 1111 1111 1000<br /><br /><br /><br /><strong><font color="#ff0000" size="2">请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</font></strong><a href="/rosen"><font color="#ff0000" size="2" face="宋体"><strong>http://www.blogjava.net/rosen</strong></font></a></p>
<img src ="http://www.blogjava.net/rosen/aggbug/9955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:45 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 工具，你用了吗？（翻译）</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9954.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9954.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9954.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9954.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9954.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者语</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt">
								<p>
								</p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">今天是一特殊日子，本人特推出一小篇译文，希望大家喜欢！</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本文列出了</span>
						<span lang="EN-US">Bruce Eckel</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所推荐的各种</span>
						<span lang="EN-US">Java</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具，不知道你用了吗？</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="3">
								<p>
								</p>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正文</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt">
								<p>
								</p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">非常荣幸，我在这里向大家探讨关于最好的</span>
						<span lang="EN-US">Java</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具的话题。它们已被全部罗列在下面了。每个工具都是从他人的建议以及我的切身体会中提炼出来的。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">IDE</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">Eclipse (www.Eclipse.org) 
<p></p></span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它拥有杰出的性能（在各个方面），并且还是免费的。免费并不总是重点，但是对于一个</span>
						<span lang="EN-US">IDE</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来说，免费很重要，因为它降低了开发的屏障（成本），也为想要从书本上学习编码技术的一类人提供了条件。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外，实际上</span>
						<span lang="EN-US">Eclipse</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">被设计为可进行二次开发的产品，可以扩展和重新发布成为独立的应用程序平台，这是非常吸引人的。它将会吸引人们对它进行更多的关注（投资）。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码的格式化器：暂缺</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">
								<p>
								</p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>Eclipse</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有一内建工具，几乎可以在这方面做得很完美，但也不是万能的。如果特别挑剔的话，据我所知，无论哪一个格式化器，对注释的重定格式不会让人那么满意。我所需要的是所有的东西都要精确的放在所规定的格式限制中。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>Jalopy</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">像是一个领跑者，但是纵观历史，它也不能解决注释的重定格式问题。它是一个商业化的产品（</span>
						<span lang="EN-US">40</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">美元非常合理）。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">单元测试：</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">JUnit 
<p></p></span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我发现</span>
						<span lang="EN-US">JUnit</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">初始版本不太令人愉快，所以我就自己开发了一个。接着</span>
						<span lang="EN-US">JUnit</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">小组魔法般的修正了</span>
						<span lang="EN-US">JUnit</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，以至于它可以和我的产品做一样的事情，所以</span>
						<span lang="EN-US">JUnit</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以以这一点来推销自己（好像有点傲慢）。目前，大多数用户都在使用它，以至于</span>
						<span lang="EN-US">JUnit</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成为一种事实上的标准。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为单元测试进行覆盖测试：</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">
								<a href="http://www.thecortex.net/clover/">
										<font color="#000080">Clover</font>
								</a>
								<p>
								</p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不太了解这个工具，我没有使用过，但是这种概念看上去很好。它有</span>
						<span lang="EN-US">250</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">美元的高价。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构管理：</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">Ant 
<p></p></span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参考</span>
						<span lang="EN-US">http://mindview.net/WebLog/log-0046</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来学习“为什么使用</span>
						<span lang="EN-US">Ant</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”。</span>
						<span lang="EN-US">Maven</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">像是作为</span>
						<span lang="EN-US">Ant</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的替换产品，但如果要用的话，还必须更深入的研究一下。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">样式检查</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">/Bug</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">探测器</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">
								<p>
								</p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
						<a href="http://checkstyle.sourceforge.net/">
								<font color="#000080" size="3">Checkstyle</font>
						</a>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<font size="3">是开源的，有点像下面的工具：</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
						<a href="http://pmd.sourceforge.net/">
								<font color="#000080" size="3">PMD</font>
						</a>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
						<a href="http://findbugs.sourceforge.net/">
								<font color="#000080" size="3">FindBugs</font>
						</a>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
						<a href="http://www.teamstudio.com/">
								<font color="#000080" size="3">Teamstudio</font>
						</a>
						<font size="3">295</font>
				</span>
				<font size="3">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">美元，我认为官方站点只是一个演示。</span>
						<span lang="EN-US">2003 12</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">月份有一个</span>
						<span lang="EN-US">JDJ</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的评论，其他的我就不清楚了。如果你已经体验过的话，请给我留言。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">性能调整：</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">
								<a href="http://www.quest.com/jprobe/">
										<font color="#000080">JProbe</font>
								</a>
								<p>
								</p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我没有用过它，不能从它的网站上断定出这个产品的性能（价格）。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">
								<font size="3">    </font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节码混淆器：</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt">
								<a href="http://www.yworks.com/en/products_yguard_about.htm">
										<font color="#000080">YGuard</font>
								</a>
								<p>
								</p>
						</span>
				</b>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你不想他人反编译</span>
						<span lang="EN-US">(reverse-engineer)</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你的代码，你就可以用它。再次重申，我也没有用过。显然这是一个基于</span>
						<span lang="EN-US">LGPL</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">协议发布的工具，给你一个免费的选择。<br /><br /><br /><strong><font color="#ff0000" size="2">请注意！引用、转贴本文应注明原译者：Rosen Jiang 以及出处：</font></strong><a href="/rosen"><font face="宋体" color="#ff0000" size="2"><strong>http://www.blogjava.net/rosen</strong></font></a></span>
				</font>
		</p>
<img src ="http://www.blogjava.net/rosen/aggbug/9954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:44 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>循证克隆</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9951.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9951.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9951.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9951.html</trackback:ping><description><![CDATA[<P>&nbsp;前几天在一篇文章中聊到克隆的话题（参看<A href="http://blog.csdn.net/rosen/archive/2004/10/09/129948.aspx"><FONT color=#000080>http://blog.csdn.net/rosen/archive/2004/10/09/129948.aspx</FONT></A>）。有朋友对我所提出的克隆可以提高效率深表怀疑，今天我就来具体说明一下。</P>
<P><STRONG>现在有一典型的 VO 类 Auto(LightWeight)：</STRONG><BR>
<TABLE style="WIDTH: 484px; HEIGHT: 100px" height=100 cellSpacing=0 cellPadding=0 width=484 border=1>
<TBODY>
<TR>
<TD>
<P><FONT size=2>package com.test;</FONT></P>
<P><FONT size=2>public class Auto implements Cloneable{<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; private String No;<BR>&nbsp;&nbsp;&nbsp; private String Addr;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; public Object clone() throws CloneNotSupportedException{<BR>&nbsp;return super.clone();<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; public String setNo(String no){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.No=no;<BR>&nbsp;&nbsp;&nbsp; }&nbsp; <BR>&nbsp;&nbsp;&nbsp; public String getNo(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.No;<BR>&nbsp;&nbsp;&nbsp; }&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; public String setAddr(String addr){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Addr=addr;<BR>&nbsp;&nbsp;&nbsp; }&nbsp; <BR>&nbsp;&nbsp;&nbsp; public String getAddr(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Addr;<BR>&nbsp;&nbsp;&nbsp; }<BR>}</FONT></P></TD></TR></TBODY></TABLE><BR>&nbsp;&nbsp;&nbsp; 接着分别通过使用克隆和不使用克隆的 Bean 来构造 Auto 实例。</P>
<P><STRONG>使用克隆的 Bean：</STRONG><BR>
<TABLE style="WIDTH: 484px; HEIGHT: 100px" height=100 cellSpacing=0 cellPadding=0 width=484 border=1>
<TBODY>
<TR>
<TD>
<P><FONT size=2>package com.test;</FONT></P>
<P><FONT size=2>import java.io.*;<BR>import java.util.*;<BR>import org.dom4j.*;<BR>import org.dom4j.io.*;</FONT></P>
<P><FONT size=2>public class MyXMLReader {</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; Auto auto=new Auto();&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; //请比较不同<BR>&nbsp;&nbsp;&nbsp; ArrayList al=new ArrayList();</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; public ArrayList go() {<BR>&nbsp;long lasting = System.currentTimeMillis();<BR>&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp; File f = new File("data_100k.xml");<BR>&nbsp;&nbsp;&nbsp;&nbsp; SAXReader reader = new SAXReader();<BR>&nbsp;&nbsp;&nbsp;&nbsp; Document doc = reader.read(f);<BR>&nbsp;&nbsp;&nbsp;&nbsp; Element root = doc.getRootElement();<BR>&nbsp;&nbsp;&nbsp;&nbsp; Element foo;<BR>&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foo = (Element) i.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto.setNo(foo.elementText("NO"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto.setAddr(foo.elementText("ADDR"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; al.add(auto.clone());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //请比较不同<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;}<BR>&nbsp;System.out.println("运行时间：" + (System.currentTimeMillis() - lasting) + " 毫秒");<BR>&nbsp;return al;<BR>&nbsp;&nbsp;&nbsp; }<BR>}</FONT></P></TD></TR></TBODY></TABLE><BR>&nbsp;&nbsp;&nbsp; 取八次运行时间<BR>&nbsp;&nbsp;&nbsp; 运行时间：172 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：93 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：94 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：141 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：125 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：78 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：203 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：63 毫秒<BR><BR><STRONG>没有使用克隆的 Bean：</STRONG><BR>
<TABLE style="WIDTH: 484px; HEIGHT: 100px" height=100 cellSpacing=0 cellPadding=0 width=484 border=1>
<TBODY>
<TR>
<TD>
<P><FONT size=2>package com.test;</FONT></P>
<P><FONT size=2>import java.io.*;<BR>import java.util.*;<BR>import org.dom4j.*;<BR>import org.dom4j.io.*;</FONT></P>
<P><FONT size=2>public class MyXMLReader {</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; ArrayList al=new ArrayList();</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; public ArrayList go() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long lasting = System.currentTimeMillis();<BR>&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp; File f = new File("data_100k.xml");<BR>&nbsp;&nbsp;&nbsp;&nbsp; SAXReader reader = new SAXReader();<BR>&nbsp;&nbsp;&nbsp;&nbsp; Document doc = reader.read(f);<BR>&nbsp;&nbsp;&nbsp;&nbsp; Element root = doc.getRootElement();<BR>&nbsp;&nbsp;&nbsp;&nbsp; Element foo;<BR>&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {<BR>&nbsp;&nbsp;foo = (Element) i.next();<BR>&nbsp;&nbsp;Auto auto=new Auto();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //请比较不同<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto.setNo(foo.elementText("NO"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto.setAddr(foo.elementText("ADDR"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; al.add(auto);&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; //请比较不同<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;}<BR>&nbsp;System.out.println("运行时间：" + (System.currentTimeMillis() - lasting) + " 毫秒");<BR>&nbsp;return al;<BR>&nbsp;&nbsp;&nbsp; }<BR>}</FONT></P></TD></TR></TBODY></TABLE><BR>&nbsp;&nbsp;&nbsp; 取八次运行时间<BR>&nbsp;&nbsp;&nbsp; 运行时间：187 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：93 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：172 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：78 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：204 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：79 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：204 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：78 毫秒</P>
<P>&nbsp;&nbsp;&nbsp; 通过比较，克隆与非克隆，在构造 Auto 上花的时间是差不多的。<BR>&nbsp;&nbsp;&nbsp; 且慢，让我们再看下面的 Auto 类。<BR><BR><STRONG>修改一下 Auto 类的构造函数，像这样(HeavyWeight)：</STRONG><BR>
<TABLE style="WIDTH: 474px; HEIGHT: 100px" height=100 cellSpacing=0 cellPadding=0 width=474 border=1>
<TBODY>
<TR>
<TD>
<P><FONT size=2>package com.test;<BR>import java.io.*;</FONT></P>
<P><FONT size=2>public class Auto implements Cloneable{<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; private String No;<BR>&nbsp;&nbsp;&nbsp; private String Addr;<BR>&nbsp;&nbsp;&nbsp; private String str;<BR>&nbsp;&nbsp;&nbsp; private File f = new File("data_10k.xml");<BR>&nbsp;&nbsp;&nbsp; private StringBuffer sb=new StringBuffer();<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; public Object clone() throws CloneNotSupportedException{<BR>&nbsp;return super.clone();<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; //以下方法仅仅为了构造一个 HeavyWeight 对象。<BR>&nbsp;&nbsp;&nbsp; public Auto(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader inbuffer=new BufferedReader(new FileReader(f));<BR>&nbsp;&nbsp;&nbsp;&nbsp; while ((str=inbuffer.readLine())!=null){ <BR>&nbsp;&nbsp;sb.append(str); <BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;}catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.toString()); <BR>&nbsp;}<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; public String setNo(String no){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.No=no;<BR>&nbsp;&nbsp;&nbsp; }&nbsp; <BR>&nbsp;&nbsp;&nbsp; public String getNo(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.No;<BR>&nbsp;&nbsp;&nbsp; }&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; public String setAddr(String addr){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Addr=addr;<BR>&nbsp;&nbsp;&nbsp; }&nbsp; <BR>&nbsp;&nbsp;&nbsp; public String getAddr(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Addr;<BR>&nbsp;&nbsp;&nbsp; }<BR>}</FONT></P></TD></TR></TBODY></TABLE><BR>&nbsp;&nbsp;&nbsp; <STRONG>再看看测试数据呢？</STRONG></P>
<P>&nbsp;&nbsp;&nbsp; 使用克隆构造 Auto 实例：&nbsp;&nbsp;&nbsp;&nbsp; 不使用克隆构造 Auto 实例：</P>
<P>&nbsp;&nbsp;&nbsp; 运行时间：188 毫秒&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时间：2219 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：78 毫秒&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时间：2266 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：109 毫秒&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时间：2156 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：219 毫秒&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时间：2093 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：110 毫秒&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时间：2266 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：78 毫秒&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时间：2141 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：157 毫秒&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时间：2078 毫秒<BR>&nbsp;&nbsp;&nbsp; 运行时间：78 毫秒&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时间：2172 毫秒</P>
<P>&nbsp;&nbsp;&nbsp; 好了，让我们查看一下 Auto 类。可以看见只是在其构造函数中加入读取10K XML文件的代码，而克隆与非克隆运行时间却有近 10 倍的差距！<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>为什么会这样？</STRONG></P>
<P>&nbsp;&nbsp;&nbsp; 对象的构建不仅仅是“分配内存＋初始化一些值域”那么简单，它可能涉及非常多个步骤。所以将“待建对象”的数量和体积减到最低，才是明智之举。</P>
<P>&nbsp;&nbsp;&nbsp; 让我们看看创建一个 LightWeight 类都发生了什么：</P>
<P>&nbsp;&nbsp;&nbsp; 1、从 heap 分配内存，用来存放 Auto 类的实例变量，以及一份“实现专署数据”。<BR>&nbsp;&nbsp;&nbsp; 2、Auto 类的实例变量 No 和 Addr，被初始化为缺省值，缺省值都为null。<BR>&nbsp;&nbsp;&nbsp; 3、调用 Auto 类构造函数。<BR>&nbsp;&nbsp;&nbsp; 4、Auto 类构造函数调用其超类（java.lang.Object）的构造函数。<BR>&nbsp;&nbsp;&nbsp; 5、java.lang.Object 构造函数返回。<BR>&nbsp;&nbsp;&nbsp; 6、对象引用“auto”指向 heap 中完成的 Auto 对象。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 再让我们看看创建一个 HeavyWeight 类都发生了什么：</P>
<P>&nbsp;&nbsp;&nbsp; 1、从 heap 分配内存，用来存放 Auto 类的实例变量，以及一份“实现专署数据”。<BR>&nbsp;&nbsp;&nbsp; 2、Auto 类的实例变量 No、Addr、str、f、sb，被初始化为缺省值，缺省值都为null。<BR>&nbsp;&nbsp;&nbsp; 3、File 类的构造函数载入 10K XML 文件得到实例变量 f，调用 StringBuffer 的构造函数得到实例变量 sb，接着调用 Auto 类构造函数。（在构造函数本体执行之前，所有实例变量的初始设定值和初始化区段先获得执行，然后才执行构造函数本体。针对 f 和 sb，又从步骤 1 开始重复这个过程。）<BR>&nbsp;&nbsp;&nbsp; 4、Auto 类构造函数中调用 FileReader 类的构造函数将实例变量 f 载入，接着调用 BufferedReader 类的构造函数将 FileReader 类的实例载入，得到局部变量 inbuffer。（针对 FileReader 类的实例和 inbuffer，又从步骤 1 开始重复这个过程。）<BR>&nbsp;&nbsp;&nbsp; 5、读取 inbuffer 中的数据，实例变量 sb 被循环赋值。<BR>&nbsp;&nbsp;&nbsp; 6、跳出循环后，实例变量 sb 经过方法调用返回给实例变量 str。<BR>&nbsp;&nbsp;&nbsp; 7、Auto 类构造函数调用其超类（java.lang.Object）的构造函数。<BR>&nbsp;&nbsp;&nbsp; 8、java.lang.Object 构造函数返回。<BR>&nbsp;&nbsp;&nbsp; 9、对象引用“auto”指向 heap 中完成的 Auto 对象。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 通过比较可以看出，建立 HeavyWeight 对象比建立 LightWeight 对象的性能相差很多。步骤 3、4 代价最高，因为它不得不对四个聚合对象重复全过程。<BR>&nbsp;&nbsp;&nbsp; 创建对象代价高昂（特别是 HeavyWeight 对象）！应尽量减少创建次数。创建对象的次数越少，意味代码执行越快。对于 Auto 类(HeavyWeight)，复用对象引用“auto”所指向的对象才是正解。<BR>&nbsp;&nbsp;&nbsp; 对象复用的一种重要方式就是克隆。任何类如果支持克隆操作，就必须实现 Cloneable 接口，这只是一个标识接口，它并没有实现任何方法。任何类如果实现 Cloneable，就宣布它支持克隆操作。正如以上这些代码，利用克隆来提高性能是非常简单的。<BR><BR><BR><STRONG><FONT color=#ff0000 size=2>请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</FONT></STRONG><A href="http://www.blogjava.net/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A></P><img src ="http://www.blogjava.net/rosen/aggbug/9951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:41 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 Eclipse 中使用 JUnit（翻译）</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9945.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9945.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9945.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9945.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9945.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><FONT size=2>这篇文章将向你介绍Junit，一个用来在项目中进行测试和调试的工具。在介绍完TDD（以测试驱动开发）理论后，将进一步讲解怎样在流行的Eclipse中建立你自己的JUnit测试。向你展示如何测试Hello World这样简单的程序。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>许多书上都讨论了自动测试，但是只有很少的著作注意到这么一个问题，那就是怎样把这些测试组织起来。随着测试的增加，放置和调用这些测试却变得更加麻烦。这将成为一个重要问题，以至于出现了TDD，极限编程（XP）使TDD得以普及。另外，你可以这样理解TDD：通过测试来开发。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><FONT size=2><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><B style="mso-bidi-font-weight: normal"><SPAN lang=EN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">TDD的主要规范：&nbsp;</SPAN></B></FONT><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>在编写程序代码之前，与之对应的自动测试必须被写好。甚至程序代码并不存在，那也要看见一个失败的测试结果。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>在测试通过后，副本代码必须被丢弃。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>有一个具体步骤（可能指的是《Extreme Programming》）可以被任何一个程序员来参考，而不需要特殊的其他方法。在我们开始写测试之前，这些步骤（章节）应该被首先阅读——怎样组织自动测试。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>讲解一下不同种类的测试：&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><B style="mso-bidi-font-weight: normal">单元测试：</B>检测模块（也就是类）的正确性。如果对象需要访问外部的数据资源，例如数据库，就需要模拟一个mock objects，但在实际中真实数据与测试环境是不同的。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><B style="mso-bidi-font-weight: normal">客户测试：</B>这是功能性、系统、和验收测试。用来测试整体的系统特性。在XP中，这些测试由用户编写。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><B style="mso-bidi-font-weight: normal">综合测试：</B>介于用户测试和单元测试之间的桥梁。综合测试帮助测试应用程序的交互性。一般情况下，mock objects不被用于综合测试，它会增加测试时间。同样，综合测试经常依赖特殊的测试环境，例如数据库送来的测试数据。综合测试也需要用到外部类库。例如为J2EE应用程序进行综合测试的类库Cactus。解释这些测试超出了本文的范围，需要更加详细的信息请参考</FONT><A href="http://jakarta.apache.org/cactus/"><FONT color=#000080 size=2>http://jakarta.apache.org/cactus/</FONT></A><FONT size=2>。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><B style="mso-bidi-font-weight: normal">开发人员测试：</B>这是用来让开发人员检验自己代码或新函数的。对于每一个开发人员，只要有可能，就需要有更多的测试来检验代码。组织这些测试和组织程序代码一样重要。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>在以下章节，只要提到“测试”，那就指的是开发人员测试。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN> 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>我们几乎准备好开始建立测试了，先应该为我们的测试选择名字。你也许会说，“这不是问题：把‘Test’这个字放在类名前面，就好了！”不会这么快！让我来说一下这个步骤存在的问题：&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>在TDD中，被测试的类或者方法还不存在。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>一个测试能够覆盖多个方法，甚至多个类，这是可能的。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>以上只是一些普遍问题；还存在更多的问题。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>让我来提一个建议，在测试命名时：测试类的名字应该让人一眼就知道这是一个测试类，且能说明它要测试什么，注意是否和其他类重名。按照以上建议做，就很简单了，也不用担心名字太长或难听。</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>即将在Eclipse中用JUnit工具创建我们第一个测试了。假设你已经下载了一个最新的Eclipse版本。如果还没有，你应该去官方站点http://www.eclipse.org下载。还需要JUnit，也可以从http://www.junit.org/下载。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>运行Eclipse。新建一个workplace项目，点击<B style="mso-bidi-font-weight: normal">文件</B>-&gt;<B style="mso-bidi-font-weight: normal">新建</B>-&gt;<B style="mso-bidi-font-weight: normal">项目</B>，选择Java项目，点击<B style="mso-bidi-font-weight: normal">下一步</B>。起一个项目名称，例如ProjectWithJUnit。点击<B style="mso-bidi-font-weight: normal">完成</B>。这样就完成新项目的建立了。再来配置一下Eclipse，在构建路径中添加JUnit类库。在工具条上点击<B style="mso-bidi-font-weight: normal">项目</B>-&gt;<B style="mso-bidi-font-weight: normal">属性</B>，选择<B style="mso-bidi-font-weight: normal">Java构建路径</B>，<B style="mso-bidi-font-weight: normal">库</B>，选择<B style="mso-bidi-font-weight: normal">添加外部JAR</B>，浏览Junit被存储的目录，选择junit.jar，点击<B style="mso-bidi-font-weight: normal">打开</B>。你将会看见JUnit出现在库的列表中。点击<B style="mso-bidi-font-weight: normal">确定</B>，让Eclipse重建路径。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>现在开发我们的“Hello World”例子。按照TDD的规则，应该在代码建立以前先把测试写好。为了能够在某出开始，我们假设未来的类名是HelloWorld，并且有一个方法Say()，这个方法返回String的值（例如“Hello World!”）。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>建立测试，在ProjectWithJUnit的标题上面点击右键，选择<B style="mso-bidi-font-weight: normal">新建</B>-&gt;<B style="mso-bidi-font-weight: normal">其他</B>，展开“Java”选项，选择<B style="mso-bidi-font-weight: normal">JUnit</B>。在右边的栏目对话框中选择测试案例，然后下一步。参考图1。</FONT></SPAN>&nbsp; </P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63pt; mso-char-indent-count: 6.0" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SHAPETYPE id=_x0000_t75 coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"></SHAPETYPE><STROKE joinstyle="miter"></STROKE><FORMULAS></FORMULAS><F eqn="if lineDrawn pixelLineWidth 0"></F><F eqn="sum @0 1 0"></F><F eqn="sum 0 0 @1"></F><F eqn="prod @2 1 2"></F><F eqn="prod @3 21600 pixelWidth"></F><F eqn="prod @3 21600 pixelHeight"></F><F eqn="sum @0 0 1"></F><F eqn="prod @6 1 2"></F><F eqn="prod @7 21600 pixelWidth"></F><F eqn="sum @8 21600 0"></F><F eqn="prod @7 21600 pixelHeight"></F><F eqn="sum @10 21600 0"></F><PATH o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></PATH><LOCK v:ext="edit" aspectratio="t"></LOCK>
<P align=left></P></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<IMG alt="" hspace=0 src="http://www.onjava.com/onjava/2004/02/04/graphics/juie1ss.gif" align=baseline border=0></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">图<SPAN lang=EN>1. 在Eclipse中建立JUnit测试 </SPAN></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体">
<P align=left></P></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><FONT size=2>在测试类这一栏中，写上将要被测试的类名HelloWorld。选择一个<B style="mso-bidi-font-weight: normal">测试案例</B>的名字，例如TestThatWeGetHelloWorldPrompt（是的，看上去很长，但是很清楚它的行为。）点击<B style="mso-bidi-font-weight: normal">完成</B>。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>TestThatWeGetHelloWorldPrompt的代码如下：</FONT></SPAN></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>import junit.framework.TestCase;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>public class TestThatWeGetHelloWorldPrompt&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>extends TestCase {&nbsp;<BR><BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public TestThatWeGetHelloWorldPrompt(&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>String name) {&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>super(name);&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} </P>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public void testSay() {&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>HelloWorld hi = new HelloWorld();&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>assertEquals("Hello World!", hi.say()); </P>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public static void main(String[] args) {&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>junit.textui.TestRunner.run(&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>TestThatWeGetHelloWorldPrompt.class);&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></SPAN> </P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>代码并不复杂；只是有点与众不同。然而，让我们考察一下细节。我们继承了JUnit的TestCase类，它在JUnit的javadocs定义为“运行众多测试的夹具。”JUnit也有TestSuite类，它是一组测试案例的集合，但在本文中不做讨论。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes"></SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>建立测试案例的步骤如下： 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes"></SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>1、建立一个junit.framework.TestCase的实例。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>2、定义一些以“test”开头的无返回方法（例如testWasTransactionSuccessful()，testShow()，等等）。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes"></SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>TestThatWeGetHelloWorldPrompt.java包含这些：TestCase的子类和一个叫做testSay()的方法。这个方法调用了assertEquals()函数，它用来比较我们预期的值和由say()返回的值。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>main()方法用来运行测试和显示输出的。JUnit的TestRunner处理测试，提供基于图像和文本的输出表现形式。我们使用基于文本的版本，因为Eclipse支持它，且也适合我们。当开始运行后，基于文本的版本测试会以文本形式输出，Eclipse会把这些输出自动变成图像界面的输出。&nbsp;</FONT></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>按照TDD规范，首次运行测试，应该故意让它失败。点击<B style="mso-bidi-font-weight: normal">运行</B>-&gt;<B style="mso-bidi-font-weight: normal">运行为</B>-&gt;<B style="mso-bidi-font-weight: normal">Junit测试</B>（记住TestThatWeGetHelloWorldPrompt.java应该被突出的显示在包资源管理器中）。在左边窗口，应该看见JUnit窗口而不是<B style="mso-bidi-font-weight: normal">包资源管理器</B>，它显示一个红条，一次失败的测试，具体的失败原因参看图2。如果没有自动显示这些内容，点击<B style="mso-bidi-font-weight: normal">JUnit</B>标签（在底部的左边）。</FONT></SPAN>&nbsp; </P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;</SPAN><SPAN style="mso-spacerun: yes"><IMG alt="" hspace=0 src="http://www.onjava.com/onjava/2004/02/04/graphics/juie2ss.gif" align=baseline border=0></SPAN> </P>
<P align=left></P></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">图<SPAN lang=EN>2. JUnit中失败的测试&nbsp;</SPAN></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>很好！的却失败了。现在我们来建立被测试代码：在包资源管理器窗口的ProjectWithJUnit标题上右击，选择<B style="mso-bidi-font-weight: normal">新建</B>-&gt;<B style="mso-bidi-font-weight: normal">类</B>。选择类名，我们已经假设了它叫HelloWorld，然后直接点击<B style="mso-bidi-font-weight: normal">完成</B>。为HelloWorld.java填入下列代码：</FONT></SPAN></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public class HelloWorld { 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public String say() {&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return("Hello World!");&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}&nbsp;<BR></FONT></SPAN><SPAN lang=EN style="COLOR: #000066; FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} </P>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>这段代码很简单，甚至不需要注解，我们再来看看结果。按照上面描述过的方式，在<B style="mso-bidi-font-weight: normal">JUnit</B>的窗口中显示了一个绿条，参看图3。绿条证明测试成功。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <IMG alt="" hspace=0 src="http://www.onjava.com/onjava/2004/02/04/graphics/juie3ss.gif" align=baseline border=0></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">图<SPAN lang=EN>3. JUnit中成功的测试&nbsp;</SPAN></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN> 
<P align=left></P></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><FONT size=2>现在，我们想再让测试失败一次，但原因不同。这有助于展示JUnit测试中不同的报错信息。修改assertEquals()代码，把“Hello World!”变成“Hello Me!”。当再次运行JUnit时，结果变成了红条，在<B style="mso-bidi-font-weight: normal">JUnit</B>窗口的底部输出了失败原因，参看图4。</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <IMG alt="" hspace=0 src="http://www.onjava.com/onjava/2004/02/04/graphics/juie4ss.gif" align=baseline border=0></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">图<SPAN lang=EN>4. JUnit中的ComparisonError&nbsp;</SPAN></SPAN><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN> 
<P align=left></P></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><FONT size=2>最后，我想说一下关于测试是开发过程中的必要部分的话题。测试代码一直是开发中的重要部分。经过近几年的发展，已得到了很大的提高，这要归功于强大的理论研究（比如“expectations-based development”等等），和快速发展的测试工具包，还有测试过程的改进。如果你对这篇文章感兴趣，那请你花一些时间来正式的学习一下测试理论吧，这对你的工作很有用。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes"></SPAN>
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><B style="mso-bidi-font-weight: normal">关于作者： 
<P align=left></P></B></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><B style="mso-bidi-font-weight: normal">Alexander Prohorenko</B> 一名UNIX系统管理员、网络安全管理员。 
<P align=left></P></FONT></SPAN>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P align=left></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><SPAN lang=EN style="FONT-FAMILY: 宋体"><FONT size=2><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><B style="mso-bidi-font-weight: normal">Olexiy Prohorenko </B><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</SPAN>一名Java开发者居住在乌克兰的Dniepropetrovsk。<BR><BR><BR><BR><STRONG><FONT color=#ff0000>请注意！引用、转贴本文应注明原译者：Rosen Jiang 以及出处：</FONT></STRONG><A href="http://www.blogjava.net/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A></FONT></SPAN></P><img src ="http://www.blogjava.net/rosen/aggbug/9945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:35 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>