﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Java民工的铁皮房</title><link>http://www.blogjava.net/wjywilliam/</link><description>Consciousness Of Programming - wjywilliam
想飞，总是会飞的......
</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 07:08:33 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 07:08:33 GMT</pubDate><ttl>60</ttl><item><title>软件测试遇到的情况</title><link>http://www.blogjava.net/wjywilliam/archive/2014/11/03/419428.html</link><dc:creator>wjywilliam</dc:creator><author>wjywilliam</author><pubDate>Mon, 03 Nov 2014 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/wjywilliam/archive/2014/11/03/419428.html</guid><wfw:comment>http://www.blogjava.net/wjywilliam/comments/419428.html</wfw:comment><comments>http://www.blogjava.net/wjywilliam/archive/2014/11/03/419428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wjywilliam/comments/commentRss/419428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjywilliam/services/trackbacks/419428.html</trackback:ping><description><![CDATA[<div>在软件项目的测试过程中，我们往往会遇到以下的一些情况，是开发组和测试组无法紧密协调合作的情况，我总结了以下几条比较常见的：</div><div><br />A 程序员一般情况下犯错的原因</div><div>&nbsp; 1.程序员粗心大意(本应该不出现错误，例如表现性错误)</div><div>&nbsp; 2.程序员需求理解错误&nbsp;</div><div>&nbsp; 3.程序员程序考虑不周，程序设计不够严谨 &nbsp;</div><div></div><div><br />B 测试员一般情况下导致误报Bug的原因</div><div>&nbsp; 1.测试人员需求理解错误(业务功能理解错误)&nbsp;</div><div>&nbsp; 2.测试人员常规理解错误(本是正常现象，以为是错误，常指误解业界常规实现方法等)&nbsp;</div><div>&nbsp; 3.测试人员测试功能时间范围不合规定(功能未完成已进行测试提Bug，或未按照某一时间段规定进行测试)&nbsp;</div><div>&nbsp; 4.需求功能点描述含糊不清具备争议性，或需求功能点没提及，但测试人员按照自己理解提出Bug&nbsp;</div><div></div><div><br />C 非程序错误下，导致测试出现问题的原因</div><div>&nbsp; 1.系统运行环境问题&nbsp;</div><div>&nbsp; 2.程序批量没有配合测试&nbsp;</div><div>&nbsp; 3.测试人员测试时候，数据存在垃圾数据导致出错 &nbsp;</div><div></div><img src ="http://www.blogjava.net/wjywilliam/aggbug/419428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjywilliam/" target="_blank">wjywilliam</a> 2014-11-03 09:58 <a href="http://www.blogjava.net/wjywilliam/archive/2014/11/03/419428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员眼中的《盗梦空间》 -  转载</title><link>http://www.blogjava.net/wjywilliam/archive/2010/10/04/333719.html</link><dc:creator>wjywilliam</dc:creator><author>wjywilliam</author><pubDate>Mon, 04 Oct 2010 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/wjywilliam/archive/2010/10/04/333719.html</guid><wfw:comment>http://www.blogjava.net/wjywilliam/comments/333719.html</wfw:comment><comments>http://www.blogjava.net/wjywilliam/archive/2010/10/04/333719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wjywilliam/comments/commentRss/333719.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjywilliam/services/trackbacks/333719.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">
				<span class="Apple-style-span" style="FONT-SIZE: 13px; LINE-HEIGHT: 19px; TEXT-ALIGN: left">
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 15px; WORD-BREAK: break-all; PADDING-TOP: 0px">越来越觉得《盗梦空间》是给程序员们拍的了。那么进入一层梦境到底怎么映射到编程？是递归？是循环？还是简单的函数调用？</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 15px; WORD-BREAK: break-all; PADDING-TOP: 0px">　　对于一个进入梦境中的人来说是递归，一层层push进了再一层层pop出来，对于很多进入梦境中的人来说，是函数调用，因为停在某一层梦境中的人与其他进入更深梦境中的人是同时工作的。更加确切的说，进入梦境中的人算是程序中设定的全局变量，梦境中虚拟出来的人算是局部变量，而一个程序中一般不会只有一个全局变量，所以进入梦境不是递归操作而是函数调用了。每一个虚拟出来的梦境都是一个函数，可以由任何其他梦境任何时候调用（进入），进入此函数（梦境）的变量（人），一般还是要返回的，就是函数返回的参数了，此变量返回时作为人并非没有任何变化，比如Cobb给Ariadne在梦境中注入了一个思想，那么Ariadne作为变量返回时就是经过处理的了。一般来说编程中函数最好是返回参数的，要么是直接处理后得到的最终值，要么是得到的一个标志变量，但也可以不返回参数，也就是void型的，对应到电影中就是：进入此梦境中的人可以返回，可以不返回，永远留在梦境中。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 15px; WORD-BREAK: break-all; PADDING-TOP: 0px">　　为什么进入一个梦境中比前一个梦境（或许是现实）时间要变慢了？或许可以这么理解：如果我们把现实世界看作主函数（main函数）的话，那么我们一般不喜欢在一条主线中写太长的代码，那么我们希望写一个函数来调用，写好函数之后，在此流程中直接写一个函数调用语句就行了，具体的过程就由此函数来完成，我们默认允许此函数用长一些的时间去完成逻辑功能，当然很多情况下处理时间越短越好。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 15px; WORD-BREAK: break-all; PADDING-TOP: 0px">　　进入梦境的时候会选择进入谁的梦境，被选定的这个人在程序中就对应一个最主要的变量，这个人在梦境中如果被杀掉，就对应此函数中的主要变量有问题，不符合此函数（梦境）对此变量（人）的要求。此时就要throw exception并且return回到上层梦境（函数）。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 15px; WORD-BREAK: break-all; PADDING-TOP: 0px">　　设计梦境的人就是编写此程序的程序员。此人也可以进入他设计的梦境，而程序员面对自己的程序也要不断深入，因为要找各种bug.如果此程序员留在了梦境中没有出来，我们可以这样理解，这个程序员出了问题或者说这个程序员写的程序出了问题。所以说选择一个好的造梦师（程序员）至关重要，所以cobb才会回到巴黎找他老师（也是父亲？没太弄清楚）要一个很聪明的学生，并把她培养成一个优秀的造梦师。cobb作为一个造梦师，自身条件是很好的，可是有一个致命的缺点：总是抛不掉自己过去的或是生活中或是梦境中做的不好的场景，并且这些场景会经常出现在新的梦境中。对应地，一个程序员，如果总是沿用自己过去写过的程序，那些代码段自己以前写的时候或出现了问题或者问题没有表现出来，但是在新的要求下并不符合要求了，或者写新的程序时候总是沿用自己过去的编程思想，或许那些思想并不适用于新的情况。所以一个程序员很重要的一点是要打破自己的惯性思维，遇到问题即使跟以前遇到过的很像也要仔细地重新审视。打破常规，发散思维，这样一个程序员才会有长足的发展。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 15px; WORD-BREAK: break-all; PADDING-TOP: 0px">　　作者：alexzhan，作者电子邮件：alexzhan12@gmail.com ，欢迎来信交流<br /><br /><span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="FONT-SIZE: 13px; LINE-HEIGHT: 19px">    转载自<a style="COLOR: rgb(78,10,19); TEXT-DECORATION: underline" href="http://www.williamlong.info/">月光博客</a><span class="Apple-converted-space"> </span>[<span class="Apple-converted-space"> </span><a style="COLOR: rgb(78,10,19); TEXT-DECORATION: underline" href="http://www.williamlong.info/">http://www.williamlong.info/</a><span class="Apple-converted-space"> </span>]<span class="Apple-converted-space"> </span></span></span></p>
				</span>
		</span>
<img src ="http://www.blogjava.net/wjywilliam/aggbug/333719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjywilliam/" target="_blank">wjywilliam</a> 2010-10-04 10:08 <a href="http://www.blogjava.net/wjywilliam/archive/2010/10/04/333719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Reflct反射机制一些基本用法</title><link>http://www.blogjava.net/wjywilliam/archive/2009/02/10/254041.html</link><dc:creator>wjywilliam</dc:creator><author>wjywilliam</author><pubDate>Tue, 10 Feb 2009 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/wjywilliam/archive/2009/02/10/254041.html</guid><wfw:comment>http://www.blogjava.net/wjywilliam/comments/254041.html</wfw:comment><comments>http://www.blogjava.net/wjywilliam/archive/2009/02/10/254041.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/wjywilliam/comments/commentRss/254041.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjywilliam/services/trackbacks/254041.html</trackback:ping><description><![CDATA[
		<span style="COLOR: red">
				<span style="FONT-SIZE: 14pt">
						<span style="COLOR: red">PS：若转载发布此文章或相关代码，请注明出处，谢。</span>
				</span>
		</span>
		<br />最近用到了reflct机制，此前并不熟悉，趁此机会留个底，怕忘记了，只是些小应用而已。<br /><br />1. 动态匹配方法名字赋值<br />需求：<br />一个tempLoan bean里面有几个属性 setPsAddr11，setPsAddr12，setPsAddr13，但是从DB里面取出来的只有一个psAddr1 field值，值是<br />“A~B~C”的结构。需要分别把值A赋到psAddr11，B赋到psAddr12，C赋到psAddr13。<br />为了以免后面再增加属性例如4，5，6之类的，不采取手工硬塞动作，故此采取反射，统一逻辑处理。<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: #008080">1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Class tempLoanClass </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> tempLoan.getClass();<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id="Codehighlighter1_90_519_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_519_Open_Text.style.display='none'; Codehighlighter1_90_519_Closed_Image.style.display='inline'; Codehighlighter1_90_519_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_90_519_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_90_519_Closed_Text.style.display='none'; Codehighlighter1_90_519_Open_Image.style.display='inline'; Codehighlighter1_90_519_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(tempLoan.getPsAddr1()</span><span style="COLOR: #000000">!=</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_90_519_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_90_519_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> psAddress1List </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Arrays.asList(tempLoan.getPsAddr1().split(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img id="Codehighlighter1_259_497_Open_Image" onclick="this.style.display='none'; Codehighlighter1_259_497_Open_Text.style.display='none'; Codehighlighter1_259_497_Closed_Image.style.display='inline'; Codehighlighter1_259_497_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_259_497_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_259_497_Closed_Text.style.display='none'; Codehighlighter1_259_497_Open_Image.style.display='inline'; Codehighlighter1_259_497_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; x </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> psAddress1List.size(); x</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_259_497_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_259_497_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img id="Codehighlighter1_369_384_Open_Image" onclick="this.style.display='none'; Codehighlighter1_369_384_Open_Text.style.display='none'; Codehighlighter1_369_384_Closed_Image.style.display='inline'; Codehighlighter1_369_384_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_369_384_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_369_384_Closed_Text.style.display='none'; Codehighlighter1_369_384_Open_Image.style.display='inline'; Codehighlighter1_369_384_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                        Method method </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> tempLoanClass.getDeclaredMethod(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">setPsAddr1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> (x </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">), </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Class[] </span><span id="Codehighlighter1_369_384_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_369_384_Open_Text"><span style="COLOR: #000000">{ String.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> }</span></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img id="Codehighlighter1_449_473_Open_Image" onclick="this.style.display='none'; Codehighlighter1_449_473_Open_Text.style.display='none'; Codehighlighter1_449_473_Closed_Image.style.display='inline'; Codehighlighter1_449_473_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_449_473_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_449_473_Closed_Text.style.display='none'; Codehighlighter1_449_473_Open_Image.style.display='inline'; Codehighlighter1_449_473_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                        method.invoke(tempLoan, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Object[] </span><span id="Codehighlighter1_449_473_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_449_473_Open_Text"><span style="COLOR: #000000">{ psAddress1List.get(x) }</span></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                    }</span></span><span style="COLOR: #000000">    <br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />                }</span></span></div>如上用loop来映射set的方法，由对应的get方法取出来list的元素的值，按照顺序动态赋给tempLoan 的set方法。 <br /><br />2. 根据参数对应Bean里面的变量名，把Bean内所对应的变量的值赋给另一个变量<br />需求：<br />根据传入参数一个变量名和一个BO，匹配BO里面的属性，若与传入变量名的值相同，则取BO对应属性的值赋于另一变量<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: #008080"> 1</span><img id="Codehighlighter1_92_811_Open_Image" onclick="this.style.display='none'; Codehighlighter1_92_811_Open_Text.style.display='none'; Codehighlighter1_92_811_Closed_Image.style.display='inline'; Codehighlighter1_92_811_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_92_811_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_811_Closed_Text.style.display='none'; Codehighlighter1_92_811_Open_Image.style.display='inline'; Codehighlighter1_92_811_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> setValueInField(Loan loan, String fieldName, String fieldValue) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception</span><span id="Codehighlighter1_92_811_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_92_811_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_105_743_Open_Image" onclick="this.style.display='none'; Codehighlighter1_105_743_Open_Text.style.display='none'; Codehighlighter1_105_743_Closed_Image.style.display='inline'; Codehighlighter1_105_743_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_105_743_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_105_743_Closed_Text.style.display='none'; Codehighlighter1_105_743_Open_Image.style.display='inline'; Codehighlighter1_105_743_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">try</span><span id="Codehighlighter1_105_743_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_105_743_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            Class tempLoanClass </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> loan.getClass();<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            Method[] methods </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> tempLoanClass.getMethods();<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img id="Codehighlighter1_264_733_Open_Image" onclick="this.style.display='none'; Codehighlighter1_264_733_Open_Text.style.display='none'; Codehighlighter1_264_733_Closed_Image.style.display='inline'; Codehighlighter1_264_733_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_264_733_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_264_733_Closed_Text.style.display='none'; Codehighlighter1_264_733_Open_Image.style.display='inline'; Codehighlighter1_264_733_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; x</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">methods.length; x</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_264_733_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_264_733_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                String methodName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> methods[x].getName();<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img id="Codehighlighter1_372_719_Open_Image" onclick="this.style.display='none'; Codehighlighter1_372_719_Open_Text.style.display='none'; Codehighlighter1_372_719_Closed_Image.style.display='inline'; Codehighlighter1_372_719_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_372_719_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_372_719_Closed_Text.style.display='none'; Codehighlighter1_372_719_Open_Image.style.display='inline'; Codehighlighter1_372_719_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(methodName.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">get</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&gt;-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_372_719_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_372_719_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img id="Codehighlighter1_470_701_Open_Image" onclick="this.style.display='none'; Codehighlighter1_470_701_Open_Text.style.display='none'; Codehighlighter1_470_701_Closed_Image.style.display='inline'; Codehighlighter1_470_701_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_470_701_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_470_701_Closed_Text.style.display='none'; Codehighlighter1_470_701_Open_Image.style.display='inline'; Codehighlighter1_470_701_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(methodName.substring(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">, methodName.length()).equalsIgnoreCase(fieldName))</span><span id="Codehighlighter1_470_701_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_470_701_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id="Codehighlighter1_548_549_Open_Image" onclick="this.style.display='none'; Codehighlighter1_548_549_Open_Text.style.display='none'; Codehighlighter1_548_549_Closed_Image.style.display='inline'; Codehighlighter1_548_549_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_548_549_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_548_549_Closed_Text.style.display='none'; Codehighlighter1_548_549_Open_Image.style.display='inline'; Codehighlighter1_548_549_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                        Object value </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> methods[x].invoke(loan, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Object[] </span><span id="Codehighlighter1_548_549_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_548_549_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img id="Codehighlighter1_594_679_Open_Image" onclick="this.style.display='none'; Codehighlighter1_594_679_Open_Text.style.display='none'; Codehighlighter1_594_679_Closed_Image.style.display='inline'; Codehighlighter1_594_679_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_594_679_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_594_679_Closed_Text.style.display='none'; Codehighlighter1_594_679_Open_Image.style.display='inline'; Codehighlighter1_594_679_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(value </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_594_679_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_594_679_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                            fieldValue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> value.toString();<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                        }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img id="Codehighlighter1_762_805_Open_Image" onclick="this.style.display='none'; Codehighlighter1_762_805_Open_Text.style.display='none'; Codehighlighter1_762_805_Closed_Image.style.display='inline'; Codehighlighter1_762_805_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_762_805_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_762_805_Closed_Text.style.display='none'; Codehighlighter1_762_805_Open_Image.style.display='inline'; Codehighlighter1_762_805_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span></span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Exception e)</span><span id="Codehighlighter1_762_805_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_762_805_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            e.printStackTrace();<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span></div><br />3. 这个比较寻常了，就是列出一个Class所有的全局变量名<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"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Retrieve global variable object in class</span><span style="COLOR: #008000"><br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">   Object obj </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Mytest();<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        Field[] fields </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> obj.getClass().getDeclaredFields();<br /><img id="Codehighlighter1_194_753_Open_Image" onclick="this.style.display='none'; Codehighlighter1_194_753_Open_Text.style.display='none'; Codehighlighter1_194_753_Closed_Image.style.display='inline'; Codehighlighter1_194_753_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_194_753_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_194_753_Closed_Text.style.display='none'; Codehighlighter1_194_753_Open_Image.style.display='inline'; Codehighlighter1_194_753_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, len </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> fields.length; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> len; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_194_753_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_194_753_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            String varName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> fields[i].getName();<br /><img id="Codehighlighter1_262_565_Open_Image" onclick="this.style.display='none'; Codehighlighter1_262_565_Open_Text.style.display='none'; Codehighlighter1_262_565_Closed_Image.style.display='inline'; Codehighlighter1_262_565_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_262_565_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_262_565_Closed_Text.style.display='none'; Codehighlighter1_262_565_Open_Image.style.display='inline'; Codehighlighter1_262_565_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_262_565_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_262_565_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> accessFlag </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> fields[i].isAccessible();<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                fields[i].setAccessible(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                Object o </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> fields[i].get(obj);<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Include variable：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> varName </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> o);<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                fields[i].setAccessible(accessFlag);<br /><img id="Codehighlighter1_603_655_Open_Image" onclick="this.style.display='none'; Codehighlighter1_603_655_Open_Text.style.display='none'; Codehighlighter1_603_655_Closed_Image.style.display='inline'; Codehighlighter1_603_655_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_603_655_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_603_655_Closed_Text.style.display='none'; Codehighlighter1_603_655_Open_Image.style.display='inline'; Codehighlighter1_603_655_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (IllegalArgumentException ex) </span><span id="Codehighlighter1_603_655_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_603_655_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                ex.printStackTrace();<br /><img id="Codehighlighter1_691_743_Open_Image" onclick="this.style.display='none'; Codehighlighter1_691_743_Open_Text.style.display='none'; Codehighlighter1_691_743_Closed_Image.style.display='inline'; Codehighlighter1_691_743_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_691_743_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_691_743_Closed_Text.style.display='none'; Codehighlighter1_691_743_Open_Image.style.display='inline'; Codehighlighter1_691_743_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (IllegalAccessException ex) </span><span id="Codehighlighter1_691_743_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img alt="" src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_691_743_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                ex.printStackTrace();<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />        }</span></span></div><br /><br /><span style="COLOR: red"> </span><img src ="http://www.blogjava.net/wjywilliam/aggbug/254041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjywilliam/" target="_blank">wjywilliam</a> 2009-02-10 14:40 <a href="http://www.blogjava.net/wjywilliam/archive/2009/02/10/254041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2: Jdk1.5 + Tomcat 5.0.28环境下运行Struts2的项目报错及解决方法</title><link>http://www.blogjava.net/wjywilliam/archive/2008/04/27/196637.html</link><dc:creator>wjywilliam</dc:creator><author>wjywilliam</author><pubDate>Sun, 27 Apr 2008 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/wjywilliam/archive/2008/04/27/196637.html</guid><wfw:comment>http://www.blogjava.net/wjywilliam/comments/196637.html</wfw:comment><comments>http://www.blogjava.net/wjywilliam/archive/2008/04/27/196637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wjywilliam/comments/commentRss/196637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjywilliam/services/trackbacks/196637.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt"><strong><span style="font-size: 10pt"><strong>场景：运行运用了</strong>Struts2.0 framework的项目时发生的错误。<br />
<br />
<strong>环境：</strong>sun jdk1.5.0_15 + tomcat 5.0.28</span></strong><br />
<br />
<span style="font-size: 10pt">原本以为自己玩了eclipse和myeclipse这么多年，一向项目的配置发布用myeclipse虽然没有驾轻就熟，但是至少不会被难道，这次确倒在了这个jdk 1.5及tomcat 5.0.28的环境上。谁叫以前一直没有试过在tomcat5.0.28上发布struts2呢，刚好现在客户说一定要用struts2，刚好自己也想偿偿新，却偿到了这个苦头。开始还以为是自己用myelipse deploy的问题，结果却不是，为啥别人的tomcat5.5就能好好的run呢？废话不少说，现在就看以下exception：</span><br />
<br />
</span><span style="font-size: 10pt"><strong>完整的Exception：<br />
</strong>Exception starting filter struts2<br />
javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found<br />
&nbsp;at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)<br />
&nbsp;at com.opensymphony.xwork2.util.DomHelper$DOMBuilder.&lt;clinit&gt;(DomHelper.java:167)<br />
&nbsp;at com.opensymphony.xwork2.util.DomHelper.parse(DomHelper.java:115)<br />
&nbsp;at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:786)<br />
&nbsp;at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:132)<br />
&nbsp;at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:100)<br />
&nbsp;at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:130)<br />
&nbsp;at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:52)<br />
&nbsp;at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:398)<br />
&nbsp;at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:455)<br />
&nbsp;at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:201)<br />
&nbsp;at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:225)<br />
&nbsp;at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:308)<br />
&nbsp;at org.apache.catalina.core.ApplicationFilterConfig.&lt;init&gt;(ApplicationFilterConfig.java:79)<br />
&nbsp;at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3698)<br />
&nbsp;at org.apache.catalina.core.StandardContext.start(StandardContext.java:4349)<br />
&nbsp;at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823)<br />
&nbsp;at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807)<br />
&nbsp;at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595)<br />
&nbsp;at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:277)<br />
&nbsp;at org.apache.catalina.core.StandardHost.install(StandardHost.java:832)<br />
&nbsp;at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:701)<br />
&nbsp;at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:432)<br />
&nbsp;at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983)<br />
&nbsp;at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349)<br />
&nbsp;at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)<br />
&nbsp;at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091)<br />
&nbsp;at org.apache.catalina.core.StandardHost.start(StandardHost.java:789)<br />
&nbsp;at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)<br />
&nbsp;at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478)<br />
&nbsp;at org.apache.catalina.core.StandardService.start(StandardService.java:480)<br />
&nbsp;at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313)<br />
&nbsp;at org.apache.catalina.startup.Catalina.start(Catalina.java:556)<br />
&nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br />
&nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br />
&nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />
&nbsp;at java.lang.reflect.Method.invoke(Method.java:585)<br />
&nbsp;at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287)<br />
&nbsp;at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425)<br />
</span></p>
<p><br />
<span style="font-size: 10pt"><strong>错误原因： <br />
认为是由于jdk1.5 与 tomcat5.0之间的关于 TransformerFactoryImpl 类的冲突造成的。</strong><br />
<strong>tomcat-5.0.28\common\endorsed</strong>下有两个jar包：<strong>xercesImpl.jar</strong>和<strong>xml-apis.jar</strong>，其中的类<strong> javax.xml.transform.TransformerFactory</strong> 与jdk1.5中的类<strong>org.apache.xalan.processor.TransformerFactoryImpl</strong>其实是同一个类。<br />
in tomcat java is called with the following argument:<br />
-Djava.endorsed.dirs="X:\my_app\Portal\tomcat\common\endorsed"<br />
In this directory you find two jar files: xercesImpl.jar and xml-apis.jar needed by tomcat and that must be loaded before all xmsl stuff present in the jdk (1.4 naming problem). And in the file xml-apis.jar the TransformerFactoryImpl is set to "org.apache.xalan.processor.TransformerFactoryImpl".<br />
</span><span style="font-size: 10pt"><br />
</span><span style="font-size: 10pt"><strong>解决办法：<br />
</strong>1. 将<strong>xml-apis.jar</strong>移出<strong>endorsed</strong>文件夹。<br />
2. 用xalan系列jar包替换原来的<strong>xercesImpl.jar</strong>和<strong>xml-apis.jar</strong>。<br />
&nbsp;&nbsp; xalan系列jar包：<strong>serializer.jar、xalan.jar、xercesImpl.jar和xml-apis.jar</strong>。<br />
3. For other application, just check this file or dom3-xml-apis.jar in your class path.<br />
</span><span style="font-size: 10pt"><br />
（以上参考<a href="http://www.blogjava.net/allen-zhe/"><u><font color="#000000">小立飞刀</font></u></a>的<a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/allen-zhe/archive/2007/03/02/101373.html"><font color="#000000">TransformerFactoryImpl not found exception</font></a>一文，也谢谢作者解答这个难题）</span></p>
<p><span style="font-size: 10pt"><br />
<br />
&nbsp;</p>
</span>
 <img src ="http://www.blogjava.net/wjywilliam/aggbug/196637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjywilliam/" target="_blank">wjywilliam</a> 2008-04-27 21:26 <a href="http://www.blogjava.net/wjywilliam/archive/2008/04/27/196637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个体现Java接口及工厂模式优点的例子 &amp; 设计模式之Factory</title><link>http://www.blogjava.net/wjywilliam/archive/2008/03/07/184575.html</link><dc:creator>wjywilliam</dc:creator><author>wjywilliam</author><pubDate>Fri, 07 Mar 2008 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/wjywilliam/archive/2008/03/07/184575.html</guid><wfw:comment>http://www.blogjava.net/wjywilliam/comments/184575.html</wfw:comment><comments>http://www.blogjava.net/wjywilliam/archive/2008/03/07/184575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wjywilliam/comments/commentRss/184575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjywilliam/services/trackbacks/184575.html</trackback:ping><description><![CDATA[<p>ｇｏｏ我们先来看看这两篇文章：<br />
</p>
<p><span style="font-size: 18pt">设计模式之Factory<br />
</span></p>
<p><br />
<a href="http://www.jdon.com/aboutme.htm"><u><font color="#0000ff">板桥里人</font></u></a> http://www.jdon.com 2002/10/07（转载请保留）</p>
<p><strong><em>工厂模式定义<span lang="EN-US" xml:lang="EN-US">:提供创建对象的接口.</span></em></strong></p>
<p><strong><em>为何使用<span lang="EN-US" xml:lang="EN-US">?</span></em></strong><span lang="EN-US" xml:lang="EN-US"><br />
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式，工厂模式在Java程序系统可以说是随处可见。</span></p>
<p>为什么工厂模式是如此常用？因为工厂模式就相当于创建实例对象的<span lang="EN-US" xml:lang="EN-US">new，我们经常要根据类Class生成实例对象，如A a=new A() 工厂模式也是用来创建实例对象的，所以以后new时就要多个心眼，是否可以考虑实用工厂模式，虽然这样做，可能多做一些工作，但会给你系统带来更大的可扩展性和尽量少的修改量。</span></p>
<p>我们以类<span lang="EN-US" xml:lang="EN-US">Sample为例， 如果我们要创建Sample的实例对象:</span></p>
<p><span lang="EN-US" xml:lang="EN-US">Sample sample=new Sample();</span></p>
<p>可是，实际情况是，通常我们都要在创建<span lang="EN-US" xml:lang="EN-US">sample实例时做点初始化的工作,比如赋值 查询数据库等。</span></p>
<p>首先，我们想到的是，可以使用<span lang="EN-US" xml:lang="EN-US">Sample的构造函数，这样生成实例就写成:</span></p>
<p><span lang="EN-US" xml:lang="EN-US">Sample sample=new Sample(参数);</span></p>
<p>但是，如果创建<span lang="EN-US" xml:lang="EN-US">sample实例时所做的初始化工作不是象赋值这样简单的事，可能是很长一段代码，如果也写入构造函数中，那你的代码很难看了（就需要Refactor重整）。</span></p>
<p>为什么说代码很难看，初学者可能没有这种感觉，我们分析如下，初始化工作如果是很长一段代码，说明要做的工作很多，将很多工作装入一个方法中，相当于将很多鸡蛋放在一个篮子里，是很危险的，这也是有背于<span lang="EN-US" xml:lang="EN-US">Java面向对象的原则，面向对象的封装(Encapsulation)和分派(Delegation)告诉我们，尽量将长的代码分派&#8220;切割&#8221;成每段，将每段再&#8220;封装&#8221;起来(减少段和段之间偶合联系性)，这样，就会将风险分散，以后如果需要修改，只要更改每段，不会再发生牵一动百的事情。</span></p>
<p>在本例中，首先，我们需要将创建实例的工作与使用实例的工作分开<span lang="EN-US" xml:lang="EN-US">, 也就是说，让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。</span></p>
<p>这时我们就需要<span lang="EN-US" xml:lang="EN-US">Factory工厂模式来生成对象了，不能再用上面简单new Sample(参数)。</span>还有<span lang="EN-US" xml:lang="EN-US">,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.</span>现在<span lang="EN-US" xml:lang="EN-US">Sample是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:</span></p>
<p><span lang="EN-US" xml:lang="EN-US">Sample mysample=new MySample();<br />
Sample hissample=new HisSample();</span></p>
<p>随着项目的深入<span lang="EN-US" xml:lang="EN-US">,Sample可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程序中是无法避免的.</span></p>
<p>但如果你一开始就有意识使用了工厂模式<span lang="EN-US" xml:lang="EN-US">,这些麻烦就没有了.</span></p>
<p><strong>工厂方法<br />
</strong>你会建立一个专门生产<span lang="EN-US" xml:lang="EN-US">Sample实例的工厂:</span></p>
<p>
<table style="width: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p><span lang="EN-US" xml:lang="EN-US">public class Factory{</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">public static Sample creator(int which){</span></p>
            <p>　　//getClass <span lang="EN-US" xml:lang="EN-US">产生Sample 一般可使用动态类装载装入类。<br />
            　　if (which==1)<br />
            　　　　return new SampleA();<br />
            　　else if (which==2)<br />
            　　　　return new SampleB();</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">}</span></p>
            <p><span lang="EN-US" xml:lang="EN-US">}</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>那么在你的程序中<span lang="EN-US" xml:lang="EN-US">,如果要实例化Sample时.就使用</span></p>
<p><span lang="EN-US" xml:lang="EN-US">Sample sampleA=Factory.creator(1);</span></p>
<p>这样<span lang="EN-US" xml:lang="EN-US">,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们从编程序中也能悟出人生道理?呵呵.</span></p>
<p>使用工厂方法 要注意几个角色，首先你要定义产品接口，如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory类，用来生成产品Sample，如下图，最右边是生产的对象Sample：</p>
<p>&nbsp;<img alt="" src="http://www.blogjava.net/images/blogjava_net/wjywilliam/29942/o_factory.jpg" border="0" /></p>
<p>进一步稍微复杂一点，就是在工厂类上进行拓展，工厂类也有继承它的实现类concreteFactory了<strong><em>。</em></strong></p>
<p><span lang="EN-US" xml:lang="EN-US"><strong>抽象工厂</strong><br />
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).</span></p>
<p style="margin-bottom: 12pt"><span lang="EN-US" xml:lang="EN-US">这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.</span></p>
<p style="margin-bottom: 12pt">这里假设：Sample有两个concrete类SampleA和SamleB，而Sample2也有两个concrete类Sample2A和SampleB2</p>
<p style="margin-bottom: 12pt"><span lang="EN-US" xml:lang="EN-US">那么，我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现，下面就是将上例中的Factory拓展成抽象工厂:</span></p>
<p>
<table style="width: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p><span lang="EN-US" xml:lang="EN-US">public abstract class Factory{</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">public abstract Sample creator();</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">public abstract Sample2 creator(String name); </span></p>
            <p><span lang="EN-US" xml:lang="EN-US">}</span></p>
            <p><span lang="EN-US" xml:lang="EN-US">public class SimpleFactory extends Factory{</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">public Sample creator(){<br />
            　　　　.........<br />
            　　　　return new SampleA</span><span lang="EN-US" xml:lang="EN-US"><br />
            　　}</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">public Sample2 creator(String name){<br />
            　　　　.........<br />
            　　　　return new Sample2A</span><span lang="EN-US" xml:lang="EN-US"><br />
            　　}</span></p>
            <p><span lang="EN-US" xml:lang="EN-US">}</span></p>
            <p><span lang="EN-US" xml:lang="EN-US">public class BombFactory extends Factory{</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">public Sample creator(){<br />
            　　　　......<br />
            　　　　return new SampleB</span><span lang="EN-US" xml:lang="EN-US"> <br />
            　　}</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">public Sample2 creator(String name){<br />
            　　　　......<br />
            　　　　return new Sample2B<br />
            　　}</span></p>
            <p><span lang="EN-US" xml:lang="EN-US">}</span></p>
            <p><span lang="EN-US" xml:lang="EN-US">&nbsp;</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><span lang="EN-US" xml:lang="EN-US">从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问，为什么我不可以使用两个工厂方法来分别生产Sample和Sample2? </span></p>
<p><span lang="EN-US" xml:lang="EN-US">抽象工厂还有另外一个关键要点，是因为 SimpleFactory内，生产Sample和生产Sample2的方法之间有一定联系，所以才要将这两个方法捆绑在一个类中，这个工厂类有其本身特征，也许制造过程是统一的，比如：制造工艺比较简单，所以名称叫SimpleFactory。</span><span lang="EN-US" xml:lang="EN-US"><br />
</span></p>
<p>在实际应用中，工厂方法用得比较多一些，而且是和动态类装入器组合在一起应用，</p>
<p><span lang="EN-US" xml:lang="EN-US"><strong>举例</strong> <O:P></O:P></span></p>
<p>我们以<span lang="EN-US" xml:lang="EN-US">Jive的ForumFactory为例，这个例子在前面的Singleton模式中我们讨论过，现在再讨论其工厂模式:</span></p>
<p>
<table style="width: 97%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="97%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p><span lang="EN-US" xml:lang="EN-US">public abstract class ForumFactory {</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">private static Object initLock = new Object();<br />
            　　private static String className = "com.jivesoftware.forum.database.DbForumFactory";<br />
            　　private static ForumFactory factory = null; </span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">public static ForumFactory getInstance(Authorization authorization) {<br />
            　　　　//If no valid authorization passed in, return null.<br />
            　　　　if (authorization == null) {<br />
            　　　　　　return null;<br />
            　　　　}<br />
            　　　　//以下使用了Singleton 单态模式<br />
            　　　　if (factory == null) {<br />
            　　　　　　synchronized(initLock) {<br />
            　　　　　　　　if (factory == null) {<br />
            　　　　　　　　　　　　...... </span></p>
            <p>　　　　　　　　　　<span lang="EN-US" xml:lang="EN-US">try {<br />
            　　　　　　　　　　　　　　//动态转载类<br />
            　　　　　　　　　　　　　　Class c = Class.forName(className);<br />
            　　　　　　　　　　　　　　factory = (ForumFactory)c.newInstance();<br />
            　　　　　　　　　　}<br />
            　　　　　　　　　　catch (Exception e) {<br />
            　　　　　　　　　　　　　　return null;<br />
            　　　　　　　　　　}<br />
            　　　　　　　　}<br />
            　　　　　　}<br />
            　　　　}</span></p>
            <p>　　　　<span lang="EN-US" xml:lang="EN-US">//Now, 返回 proxy.用来限制授权对forum的访问<br />
            　　　　return new ForumFactoryProxy(authorization, factory,<br />
            　　　　　　　　　　　　　　　　　　　　factory.getPermissions(authorization));<br />
            　　}</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">//真正创建forum的方法由继承forumfactory的子类去完成.<br />
            　　public abstract Forum createForum(String name, String description)<br />
            　　throws UnauthorizedException, ForumAlreadyExistsException;</span></p>
            <p>　　<span lang="EN-US" xml:lang="EN-US">....</span></p>
            <p><span lang="EN-US" xml:lang="EN-US">}</span></p>
            <p><span lang="EN-US" xml:lang="EN-US">&nbsp;</span></p>
            <p><span lang="EN-US" xml:lang="EN-US">&nbsp;</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>因为现在的<span lang="EN-US" xml:lang="EN-US">Jive是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系统实现,这个工厂方法ForumFactory就提供了提供动态接口:</span></p>
<p><span lang="EN-US" xml:lang="EN-US">private static String className = "com.jivesoftware.forum.database.DbForumFactory";</span></p>
<p>你可以使用自己开发的创建<span lang="EN-US" xml:lang="EN-US">forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.</span></p>
<p>在上面的一段代码中一共用了三种模式<span lang="EN-US" xml:lang="EN-US">,除了工厂模式外,还有Singleton单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果. &nbsp;</span></p>
<p>看看<span lang="EN-US" xml:lang="EN-US">Java宠物店中的CatalogDAOFactory:</span></p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#cccccc" border="0">
    <tbody>
        <tr>
            <td>public class CatalogDAOFactory {
            <p>&nbsp;</p>
            <p>　　/**</p>
            <p>　　* 本方法制定一个特别的子类来实现DAO模式。<br />
            　　* 具体子类定义是在J2EE的部署描述器中。<br />
            　　*/</p>
            <p>　　public static CatalogDAO getDAO() throws CatalogDAOSysException {</p>
            <p>　　　　CatalogDAO catDao = null;</p>
            <p>　　　　try {</p>
            <p>　　　　　　InitialContext ic = new InitialContext();<br />
            　　　　　　//动态装入CATALOG_DAO_CLASS<br />
            　　　　　　//可以定义自己的CATALOG_DAO_CLASS，从而在无需变更太多代码<br />
            　　　　　　//的前提下，完成系统的巨大变更。</p>
            <p>　　　　　　String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);</p>
            <p>　　　　　　catDao = (CatalogDAO) Class.forName(className).newInstance();</p>
            <p>　　　　} catch (NamingException ne) {</p>
            <p>　　　　　　throw new CatalogDAOSysException("<br />
            　　　　　　　　CatalogDAOFactory.getDAO: NamingException while <br />
            　　　　　　　　　　getting DAO type : \n" + ne.getMessage());</p>
            <p>　　　　} catch (Exception se) {</p>
            <p>　　　　　　throw new CatalogDAOSysException("<br />
            　　　　　　　　CatalogDAOFactory.getDAO: Exception while getting <br />
            　　　　　　　　　　DAO type : \n" + se.getMessage());</p>
            <p>　　　　}</p>
            <p>　　　　return catDao;</p>
            <p>　　}</p>
            <p>}<br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br style="mso-ignore: vglayout" clear="all" />
</p>
<p><span lang="EN-US" xml:lang="EN-US">CatalogDAOFactory是典型的工厂方法，catDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类，这个实现子类在Java宠物店是用来操作catalog数据库，用户可以根据数据库的类型不同，定制自己的具体实现子类，将自己的子类名给与CATALOG_DAO_CLASS变量就可以。</span></p>
<p>由此可见，工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制，只要我们更换一下具体的工厂方法，系统其他地方无需一点变换，就有可能将系统功能进行改头换面的变化。</p>
<p>设计模式如何在具体项目中应用见<a href="http://www.jdon.com/mybook/index.htm" target="_blank"><u><font color="#810081">《Java实用系统开发指南》</font></u></a><br />
<br />
</p>
<p>--------------------------------------------------------------------------------------------------------------------------------------------------------------</p>
<h3><strong>一个体现Java接口及工厂模式优点的例子(转载自<a href="http://www.jspcool.com/j2se/20071019225405.htm">http://www.jspcool.com/j2se/20071019225405.htm</a>)</strong></h3>
<p>随着模式概念的普及，了解模式和使用模式的程序员越来越多，很多人在学习模式的时候，都会有这样一种疑惑：&#8220;有必要搞得这么复杂吗？&#8221;。的确，因为教程的例子过于简单化（这样方便读者学习），或者是作者选例子的时候并没有很好体现所讲模式的优点，很多情况下如果仅就其例子的问题来说，用模式是太复杂了。因此才导致这样的误解：&#8220;模式就是把简单的问题复杂化吗？&#8221;。当然不是，随着你开发实践的不断丰富，你终会发现模式强大威力，而且模式也并非贵族化的编程方式，它就是一些经过提炼了的解决问题的方法技巧。 </p>
<p>通过学习模式，程序员开始告别过去准直线式的代码方式，模式开扩了我们的视野，强化了我们面向对象编程的思维方式。然而现在又出现了另一个普遍的问题，盲目应用模式。模式是问题的解决方案，先有问题才有模式，模式是依附于所要解决的问题的而生的。必须了解模式在很多情况下是以提高代码的复杂度为代价来增强灵活性、可复用性。如果在自已的代码中使用某一模式仅只提高了代码的复杂度，而其它方面收效甚微，或者某部份代码根本就不存在灵活性及高复用性的需求，那么我们就没有必要为使用模式而放弃更直观简单的代码写法。 </p>
<p>一流的高手90%精力关注问题的解决方案，因为找到了好的解决方案，再写起代码会很轻松代码也简洁流畅，看这样的代码是一种享受和提高；二流的熟手90%精力关注代码实现，因为问题的解决方案并非最佳，实现的代码也会比较复杂；三流菜鸟记流水帐,90%精力在敲键盘，常常做了大半才发现行不通，回过头来再用90%的时间敲键盘，根本不会用到任何模式，写出来的代码的只有他自已才能看懂。做出来的软件也是支离破碎，做一丁点改动都要大费周折，而且你还不知道改动后会产生什么问题，大有住危房里的感觉。 </p>
<p>在这里还是举一个滥用模式的例子吧。我曾参与过一个大集团公司ＯＡ系统的第二期开发，开发沿用原有代码架构并增加新的功能模块。文档很少我读原代码时就被它程序里的代码转来转去搞得头大如斗，最后读懂了：原代码架构总体采用工厂模式，而且是最复杂的抽象工厂模式。它把所有模块类都通过工厂生成还工厂套工厂，并且每一个模块类都有一个接口，每个接口也只有一个模块现实类，因为涉及权限控制还用了代理(proxy)模式。　读懂代码后我开始嵌入代码，发现每新增一个类，都要到六个Java文件中去增加相应代码，而在类中每增加一个方法，也要到它的接口等四个Java文件中去增加相应代码。天呀！！！记得当时我的小姆指常会不听使唤，就是因为频繁的使用Ctrl+C 、Ctrl+V，小姆指按着Ctrl键给累的。整个项目组苦不堪言，真烦透了。项目结束后我回顾发现：代理模式用得还对（现在针对权限这类横向控制有AOP编程这种新的解决办法了）但工厂模式在这里根本就是画蛇添足，不仅没有解决什么问题，反而增加代码复杂度和耦合性，降低了开发效率连维护难度都提高了。而且那种每个类简单的加一个接口的方式，更是没有道理，这让我很想说周星驰说过的一句话：&#8220;球~~~不是这么踢~~~~的，接口~~~不是这么用~~~的&#8221;。言归正传，我们先来看这样一个常见问题：某系统需要支持多种类型的数据库。用过Oracle、MSSQL等数据库的人都知道，它们的SQL编写方式都各有些不同。比如说Oracle的唯一标识自动+1字段用的是序列，MSSQL改一下字段属性就成了，还有各种各自特有的SQL用法。为了支持多数据库，难道我们要开发多套系统？当然NO。请看下面的解决方案。 </p>
<p>即然数据库存在多种，我们可以将系统中所有对数据库的操作抽象出来，写成一个个方法组合到一个类中，有几种数据库我们就写几个这样的类。具体设计类图如下： </p>
<p>&nbsp;</p>
<p><br />
简要说明： <br />
OracleDataOperate、SqlserverDataOperate、MysqlDataOperate，分别代表Oracle、Sqlserver、Mysql这三种数据库的操作类。继承自AbstractDataOperate <br />
AbstractDataOperate是一个抽象类，包含了那些不同种类数据库都是一样代码的操作方法。继承自DataOperate <br />
DataOperate是上面说的数据操作类的统一接口，只有两个方法：取得一条记录、插入一条记录。 <br />
DataOperateFactory是一个工厂方法，统一用它的方法来得到数据库操作类的实例。 <br />
SampleClass是我们系统的某个功能模块的类。 <br />
People是一个实体类，代表一条记录。三个字段　oid唯一标识符、name姓名、date生日。 </p>
<p>详细说明： <br />
１、所有系统功能模块类只认DataOperat这个接口还不必管具体的实现类是OracleDataOperate还SqlserverDataOperate。DataOperate源代码如下： <br />
public interface DataOperate { <br />
//根据记录的唯一标识取出一条记录 <br />
People getPeople(String oid); <br />
//插入一条记录 <br />
boolean insertPeople(People people); <br />
} </p>
<p>２、AbstractDataOperate、OracleDataOperate、SqlserverDataOperate、MysqlDataOperate都是继承DataOperate接口的，没什么好说的，省略。 </p>
<p>３、DataOperateFactory。我们看看工厂方法怎么写的。 <br />
public class DataOperateFactory { <br />
public static final int ORACLE = 0; //定义三个表示数据库类型的常量 <br />
public static final int MYSQL = 1; <br />
public static final int SQLSERVER = 2; </p>
<p>private static DataOperate db; <br />
private static int dataType = MYSQL; <br />
/** <br />
* 根据数据库类型(dataType)取得一个数据库操作类的实例， <br />
* 这里对DataOperate使用了单例模式，因为OracelDataOperate等都是无状态的工具类， <br />
* 所以整个系统只保留一个实例就行了。 <br />
* <br />
* @return 返回的是接口，客户端不必关心具体是用那个实现类 <br />
*/ <br />
public static DataOperate getInstance() { <br />
if (db == null) { <br />
if (dataType == ORACLE) //根据dateType返回相应的实现类 <br />
return new OracelDataOperate(); <br />
if (dataType == MYSQL) <br />
return new MysqlDataOperate(); <br />
if (dataType == SQLSERVER) <br />
return new SqlserverDataOperate(); <br />
} <br />
return db; <br />
} <br />
} </p>
<p>４、接下来就看看使用端是如何调用工厂方法和使用数据操作类的。 <br />
/** <br />
* 系统某个功能类 <br />
*/ <br />
public class SampleClass { <br />
private DataOperate db; //声明一个数据库操作类，注意这里用的是接口噢 <br />
/**某方法*/ <br />
public void sampleMethod() { <br />
db = DataOperateFactory.getInstance();//得到单一实例 <br />
People p = db.getPeople("123"); //取得一条记录 <br />
db.insertPeople(p);//再插回去 <br />
} <br />
} </p>
<p>　　我们发现SampleClass中根本没有出现OracelDataOperate、MysqlDataOperate等的影子，这就是接口的威力。客户端不必针对OracelDataOperate等写不同的代码，它只关心DataOperate即可，具体要取那个类的逻辑就由DataOperateFactory负责了。 </p>
<p>总结： <br />
从例子中我们可以看到什么是面向接口的编程方式。SampleClass使用数据操作类可以不必关心具体是那个类，只要是符合接口的都行 <br />
要实例？只须调用DataOperateFactory.getInstance()即可，其它的交于DataOperateFactory这个工厂来做吧，使用端什么都不用关心。 <br />
我们要支持新的数据库类型，只须要象OracelDataOperate那样，再写一个继承AbstractDataOperate的类即可，比如SysbaseDataOperate。然后到DataOperateFactory中加入相应代码即可。 <br />
如果我们想要可配置性更高，可以用private static int dataType = MYSQL;中的值设置到一个文本文件中。 <br />
　　对于开发支持多种数据库的系统，强烈建议使用hibernate，我现在做的系统就是用hibernate的，开发时用Mysql，到要给客户时将数据库换了DB2，程序不用做任何改动，真正的无逢移植。不过这样，本文所提到的方法就没什么用了.<br />
</p>
<p><br />
&nbsp;</p>
<p>这两篇是我找到的关于Factory Mode的文章，但是前面的论述很好，后面的例子却不怎么样，特别是第二篇的例子并不符合实际也没必要这样做，纯粹是接口也可以实现，Factory Mode并没有体现多少。第一篇的就似乎比较切实，但是说的也不够清晰。</p>
<img src ="http://www.blogjava.net/wjywilliam/aggbug/184575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjywilliam/" target="_blank">wjywilliam</a> 2008-03-07 18:11 <a href="http://www.blogjava.net/wjywilliam/archive/2008/03/07/184575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript(JSValidation) </title><link>http://www.blogjava.net/wjywilliam/archive/2007/04/07/109043.html</link><dc:creator>wjywilliam</dc:creator><author>wjywilliam</author><pubDate>Fri, 06 Apr 2007 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/wjywilliam/archive/2007/04/07/109043.html</guid><wfw:comment>http://www.blogjava.net/wjywilliam/comments/109043.html</wfw:comment><comments>http://www.blogjava.net/wjywilliam/archive/2007/04/07/109043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wjywilliam/comments/commentRss/109043.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjywilliam/services/trackbacks/109043.html</trackback:ping><description><![CDATA[<p><strong>原文出处</strong></p>
<a href="http://www.amowa.net/jsvalidation/userguide.html" target=_blank><u><font color=#800080>http://www.amowa.net/jsvalidation/userguide.html</font></u></a><br>
<img src ="http://www.blogjava.net/wjywilliam/aggbug/109043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjywilliam/" target="_blank">wjywilliam</a> 2007-04-07 00:04 <a href="http://www.blogjava.net/wjywilliam/archive/2007/04/07/109043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMS SQL Manager 2007 Professional for Oracle 更新数据的问题(字符集的问题)！</title><link>http://www.blogjava.net/wjywilliam/archive/2007/04/03/108196.html</link><dc:creator>wjywilliam</dc:creator><author>wjywilliam</author><pubDate>Tue, 03 Apr 2007 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/wjywilliam/archive/2007/04/03/108196.html</guid><wfw:comment>http://www.blogjava.net/wjywilliam/comments/108196.html</wfw:comment><comments>http://www.blogjava.net/wjywilliam/archive/2007/04/03/108196.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/wjywilliam/comments/commentRss/108196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjywilliam/services/trackbacks/108196.html</trackback:ping><description><![CDATA[<p>&nbsp; 最近一年的project的DB是oracle，所以找了个第三方的sql 工具TOAD，当然toad非常的不错，而且功能非常多强，但是用了这么久，还是有点不习惯它的窗口风格。而以前自己在玩mysql的时候又发现了一个非常不错的mysql管理工具叫<span style="COLOR: #0000ff">EMS MYSQL MANAGER 2005</span>，功能呢也是非常的强，而且界面友善，风格比较传统易用，就在想有没有一个EMS SQL MANAGER 是for oracle的呢？结果前段时间终于给我下载到<span style="COLOR: #0000ff">EMS SQL Manager 2007&nbsp;for Oracle</span>了，而且有了破解，高兴得要命，立刻去尝尝新。果然功能一样的强大，几乎toad有的ems sql manager都有了，而且界面易用友好（例如filter的功能还比toad的强），就决定用这个了。<br></p>
<p>但是问题终于出来了，在试的时候只管用query功能，没有进行在data browser 里面data的add和update，想不到我随便改一个记录，立刻就显示了<span style="COLOR: red">ORA-01461: can bind a LONG value only for insert into a LONG</span> 的错误，后来查了一下资料发现不可能是long型的问题，我根本没有long type的column，也没超字符，后来就发现是client的charsetEncoding的问题了，是字符集的问题了，但是我在用for mysql的版本的时候，在&#8220;database info&#8221;</p>
<p>选项里面是有得设client char的，在for oracle里面却没有，好像是默认跟system的字符集吧，&nbsp;就这样子，没得设字符集就没法子修改数据了，一commit就报<span style="COLOR: red">ORA-01461</span>:，查了好久资料发现很少人用EMS的工具，真想用这工具阿，郁闷了很久阿。。。哪位仁兄高手用过知道解决办法的能告诉吗？谢谢了</p>
<img src ="http://www.blogjava.net/wjywilliam/aggbug/108196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjywilliam/" target="_blank">wjywilliam</a> 2007-04-03 14:11 <a href="http://www.blogjava.net/wjywilliam/archive/2007/04/03/108196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网页表单相关特效整理</title><link>http://www.blogjava.net/wjywilliam/archive/2006/11/19/82094.html</link><dc:creator>wjywilliam</dc:creator><author>wjywilliam</author><pubDate>Sun, 19 Nov 2006 12:43:00 GMT</pubDate><guid>http://www.blogjava.net/wjywilliam/archive/2006/11/19/82094.html</guid><wfw:comment>http://www.blogjava.net/wjywilliam/comments/82094.html</wfw:comment><comments>http://www.blogjava.net/wjywilliam/archive/2006/11/19/82094.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wjywilliam/comments/commentRss/82094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjywilliam/services/trackbacks/82094.html</trackback:ping><description><![CDATA[
		<p>
				<strong>
						<font face="Verdana" color="#800080" size="5">网页表单相关特效整理</font>
				</strong>
				<font size="2">(转载自......忘记了，谢谢原作者)</font>
		</p>
		<p>
				<strong>只能是一些限定的东西</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 235px" name="S1" rows="1">ENTER键可以让光标移到下一个输入框 
&lt;input onkeydown="if(event.keyCode==13)event.keyCode=9" &gt; &lt;br&gt;

只能是中文&lt;input onkeyup="value=value.replace(/[ -~]/g,'')" onkeydown="if(event.keyCode==13)event.keyCode=9"&gt; &lt;br&gt;

屏蔽输入法&lt;input style="ime-mode:disabled" onkeydown="if(event.keyCode==13)event.keyCode=9"&gt; &lt;br&gt;

只能输入英文和数字&lt;input onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" onkeydown="if(event.keyCode==13)event.keyCode=9"&gt; &lt;br&gt;

只能是数字&lt;input onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"&gt;&lt;br&gt;

只能显示，不能修改&lt;input readonly value="只能显示，不能修改"&gt;

</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>只能是数字，判断按键的值。</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 183px" name="S2" rows="1">&lt;script  language=javascript&gt;
function  onlyNum()
{
if(!((event.keyCode&gt;=48&amp;&amp;event.keyCode&lt;=57)||(event.keyCode&gt;=96&amp;&amp;event.keyCode&lt;=105)||(event.keyCode==8)))
event.returnValue=false;
}
&lt;/script&gt;
&lt;input  onkeydown="onlyNum();"&gt;  
  </textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>附：获取键盘的KeyCode</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 215px" name="S3" rows="1">&lt;html&gt;
&lt;head&gt;
&lt;script language="javascript"&gt;
  ns4 = (document.layers) ? true : false;
  ie4 = (document.all) ? true : false;
function keyDown(e){
  if(ns4){
  var nkey=e.which;
  var iekey='现在是ns浏览器';
  var realkey=String.fromCharCode(e.which);
}
  if(ie4){
  var iekey=event.keyCode;
  var nkey='现在是ie浏览器';
  var realkey=String.fromCharCode(event.keyCode);
  if(event.keyCode==32){realkey='\' 空格\''}
  if(event.keyCode==13){realkey='\' 回车\''}
  if(event.keyCode==27){realkey='\' Esc\''}
  if(event.keyCode==16){realkey='\' Shift\''}
  if(event.keyCode==17){realkey='\' Ctrl\''}
  if(event.keyCode==18){realkey='\' Alt\''}
}
  alert('ns浏览器中键值:'+nkey+'\n'+'ie浏览器中键值:'+iekey+'\n'+'实际键为'+realkey);
}
document.onkeydown = keyDown;
if(ns4){
document.captureEvents(Event.KEYDOWN);}
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
//Javascript Document.
&lt;hr&gt;
&lt;center&gt;
&lt;h3&gt;请按任意一个键。。。。&lt;/h3&gt;
&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>限制网页用键盘</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 83px" name="S4" rows="1">&lt;body onkeydown="alert('禁用');return false;"&gt;
限制键盘的某个键：body onkeydown="if(event.keyCode==num){alert('禁用');return false;}
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>再加个找按键的值</strong>
		</p>
		<p>
				<strong>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 125px" name="S5" rows="1">&lt;script&gt;
function show(){
  alert("ASCII代码是："+event.keyCode);
}
&lt;/script&gt;
&lt;body onkeydown="show()"&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</strong>
		</p>
		<p>
				<strong>只能是IP地址</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 240px" name="S6" rows="1">&lt;html&gt;

&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;
&lt;meta name="GENERATOR" content="Microsoft FrontPage 4.0"&gt;
&lt;meta name="ProgId" content="FrontPage.Editor.Document"&gt;
&lt;style&gt;
.a3{width:30;border:0;text-align:center}
&lt;/style&gt;
&lt;script&gt;
function mask(obj){
obj.value=obj.value.replace(/[^\d]/g,'')
key1=event.keyCode
if (key1==37 || key1==39)
{ obj.blur();
nextip=parseInt(obj.name.substr(2,1))
nextip=key1==37?nextip-1:nextip+1;
nextip=nextip&gt;=5?1:nextip
nextip=nextip&lt;=0?4:nextip
eval("ip"+nextip+".focus()")
} 
if(obj.value.length&gt;=3) 
if(parseInt(obj.value)&gt;=256 || parseInt(obj.value)&lt;=0)
{
alert(parseInt(obj.value)+"IP地址错误！")
obj.value=""
obj.focus()
return false;
}
else 
{ obj.blur();
nextip=parseInt(obj.name.substr(2,1))+1
nextip=nextip&gt;=5?1:nextip
nextip=nextip&lt;=0?4:nextip
eval("ip"+nextip+".focus()")
}
}
function mask_c(obj)
{
clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))
}

&lt;/script&gt;
&lt;title&gt;IP地址输入&lt;/title&gt;

&lt;/head&gt;
&lt;body&gt;IP地址输入
&lt;div style="border-width:1;border-color:balck;border-style:solid;width:165;font-size:9pt"&gt;
&lt;input type=text name=ip1 maxlength=3 class=a3 onkeyup="mask(this)" onbeforepaste=mask_c()&gt;.
&lt;input type=text name=ip2 maxlength=3 class=a3 onkeyup="mask(this)" onbeforepaste=mask_c()&gt;.
&lt;input type=text name=ip3 maxlength=3 class=a3 onkeyup="mask(this)" onbeforepaste=mask_c()&gt;.
&lt;input type=text name=ip4 maxlength=3 class=a3 onkeyup="mask(this)" onbeforepaste=mask_c()&gt;
&lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>用#default#savehistory防止后退清空text文本框：</strong> </p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 212px" name="S7" rows="1">&lt;HTML&gt;
&lt;HEAD&gt;
&lt;META NAME="save" CONTENT="history"&gt;
&lt;STYLE&gt;
  .saveHistory {behavior:url(#default#savehistory);}
&lt;/STYLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
&lt;INPUT class=saveHistory type=text id=oPersistInput&gt;
&lt;input type=button onclick='javascript:location.href="http://www.cnbruce.com/red/"' value='点击进入,再按后退键试试？'&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>TEXTAREA自适应文字行数的多少</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 111px" name="S8" rows="1">&lt;textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight"&gt; 
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>上传预览图片</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 147px" name="S9" rows="1">&lt;img id=pic  src=http://www.cnbruce.com/images/logo.gif&gt;
&lt;input type=file name=file&gt;&lt;input type=button onclick=pic.src=file.value value=预览图片&gt;
&lt;input type=button onclick=alert(file.value) value=图片地址&gt;
&lt;input type=button onclick="file.outerHTML=file.outerHTML.replace(/value=\w/g,'')" value="清除file里字"&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>去掉下拉选项的边框</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 185px" name="S10" rows="1">&lt;div style="position: absolute; left: 10px; top: 10px; width: 115px; height: 20px;  clip:rect(2 114 20 2);"&gt; 
   &lt;select&gt;
    &lt;option &gt;cnpeople&lt;/option&gt;
    &lt;option &gt;cnrose&lt;/option&gt;
   &lt;option &gt;cnbruce&lt;/option&gt;  
  &lt;/select&gt;
  &lt;/font&gt;
&lt;/div&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>下拉列表打开窗口</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 149px" name="S11" rows="1">&lt;select  onChange="if(this.selectedIndex &amp;&amp; this.selectedIndex!=0){window.open(this.value);}this.selectedIndex=0;"&gt;
&lt;option selected&gt;更多链接……&lt;/option&gt;
&lt;option value="http://www.cnbruce.com"&gt;cnbruce&lt;/option&gt;
&lt;option value="http://daonet.myrice.com/old/"&gt;daonet&lt;/option&gt;
&lt;option value="http://www.blueidea.com"&gt;blue!dea
&lt;/select&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>通过下拉菜单传递跳转(触发submit)</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 140px" name="S12" rows="1">&lt;form action="showlog.asp?" &gt;
&lt;select name="cat_id" onpropertychange="form.submit();"&gt;
&lt;option value=""&gt;==请选择==&lt;/option&gt;
&lt;option value="11"&gt;11&lt;/option&gt;
&lt;option value="22"&gt;22&lt;/option&gt;
&lt;/select&gt;
&lt;/form&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>TAB键在文本域中的体现</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 158px" name="S13" rows="1">&lt;script&gt;
function editTab()
{
    var code, sel, tmp, r
    var tabs=""
    event.returnValue = false
    sel =event.srcElement.document.selection.createRange()
    r = event.srcElement.createTextRange()

    switch (event.keyCode)
    {
        case (8)    :
            if (!(sel.getClientRects().length &gt; 1))
            {
                event.returnValue = true
                return
            }
            code = sel.text
            tmp = sel.duplicate()
            tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
            sel.setEndPoint("startToStart", tmp)
            sel.text = sel.text.replace(/^\t/gm, "")
            code = code.replace(/^\t/gm, "").replace(/\r\n/g, "\r")
            r.findText(code)
            r.select()
            break
        case (9)    :
            if (sel.getClientRects().length &gt; 1)
            {
                code = sel.text
                tmp = sel.duplicate()
                tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
                sel.setEndPoint("startToStart", tmp)
                sel.text = "\t"+sel.text.replace(/\r\n/g, "\r\t")
                code = code.replace(/\r\n/g, "\r\t")
                r.findText(code)
                r.select()
            }
            else
            {
                sel.text = "\t"
                sel.select()
            }
            break
        case (13)    :
            tmp = sel.duplicate()
            tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
            tmp.setEndPoint("endToEnd", sel)

            for (var i=0; tmp.text.match(/^[\t]+/g) &amp;&amp; i&lt;tmp.text.match(/^[\t]+/g)[0].length; i++)    tabs += "\t"
            sel.text = "\r\n"+tabs
            sel.select()
            break
        default        :
            event.returnValue = true
            break
    }
}
&lt;/script&gt;

&lt;textarea cols=75 rows=20 onkeydown="editTab()"&gt;
&lt;script&gt;
alert("ok")
&lt;/script&gt;&lt;/textarea&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>文本框的上/下拉</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 197px" name="S14" rows="1">&lt;form name="cnbruce"&gt;
&lt;textarea name="com"&gt;
&lt;/textarea&gt;
&lt;/form&gt;
&lt;SPAN title='放大输入框' style='FONT-SIZE: 12px; CURSOR: hand'  onclick=document.cnbruce.com.rows+=4&gt;向下&lt;/SPAN&gt;
 &lt;SPAN title='缩小输入框' style='FONT-SIZE: 12px; CURSOR: hand' class='arrow' onclick='if(document.cnbruce.com.rows&gt;=4)document.cnbruce.com.rows-=4;else return false'&gt;向上&lt;/SPAN&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>
		<p>
				<strong>一个复选框，点击之后一组复选框全部都选上</strong>
		</p>
		<p>
				<strong>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 173px" name="S15" rows="1">&lt;input type="checkbox" name="checkA" onpropertychange="for(i=0;i&lt;A.children.length;i++){A.children[i].checked=this.checked}"&gt;a
&lt;br&gt;
&lt;span id="A"&gt;
&lt;input type="checkbox" name="A1"&gt;
&lt;input type="checkbox" name="A2"&gt;
&lt;input type="checkbox" name="A3"&gt;
&lt;/span&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</strong>
		</p>
		<p>
				<strong>Debug Textarea：在线写 js 脚本的时候，用来即时查错的东西！</strong>
		</p>
		<p>运行代码框<br /><textarea class="codeTextarea" style="WIDTH: 510px; HEIGHT: 252px" name="S16" rows="1">&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;Debug Textarea&lt;/TITLE&gt;
&lt;meta http-equiv='Content-Type' content='text/html; charset=gb2312'&gt;
&lt;/HEAD&gt;
&lt;style&gt;
* {
    font-size: 12px
}
body {
    margin: 10px; padding: 0px
}
table.list{
    cursor: default;
    border:1px solid #cccccc
    background-color: #cccccc;
    border-collapse: collapse;
    border-Color: #cccccc;
}
&lt;/style&gt;
&lt;script language="javascript"&gt;
// Coded by windy_sk &lt;windy_sk@126.com&gt; 20040205

function reportError(msg,url,line) {
    var str = "You have found an error as below: \n\n";
    str += "Err: " + msg + " on line: " + line;
    alert(str);
    return true;
}

window.onerror = reportError;


document.onkeydown = function() {
    if(event.ctrlKey){
        switch(event.keyCode) {
            case 82: //r
                runcode();
                break;
            case 83: //s
                savecode();
                break;
            case 71: //g
                goto(prompt('Please input the line number', '1'));
                break;
            case 65: //a
                document.execCommand("SelectAll");
                break;
            case 67: //c
                document.execCommand("Copy");
                break;
            case 88: //x
                document.execCommand("Cut");
                break;
            case 86: //v
                document.execCommand("Paste");
                break;
            case 90: //z
                document.execCommand("Undo");
                break;
            case 89: //y
                document.execCommand("Redo");
                break;
            default:
                break;
        }
        event.keyCode = 0;
        event.returnValue = false;
    }
    return;
}


function show_ln(){
    var txt_ln     = document.getElementById('txt_ln');
    var txt_main     = document.getElementById('txt_main');
    txt_ln.scrollTop = txt_main.scrollTop;
    while(txt_ln.scrollTop != txt_main.scrollTop) {
        txt_ln.value += (i++) + '\n';
        txt_ln.scrollTop = txt_main.scrollTop;
    }
    return;
}


function editTab(){
    var code, sel, tmp, r
    var tabs=''
    event.returnValue = false
    sel =event.srcElement.document.selection.createRange()
    r = event.srcElement.createTextRange()

    switch (event.keyCode){
        case (8)    :
            if (!(sel.getClientRects().length &gt; 1)){
                event.returnValue = true
                return
            }
            code = sel.text
            tmp = sel.duplicate()
            tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
            // 出错检验代码~~~~~~
            if(sel.parentElement() != tmp.parentElement()) return;
            sel.setEndPoint('startToStart', tmp)
            sel.text = sel.text.replace(/^\t/gm, '')
            code = code.replace(/^\t/gm, '').replace(/\r\n/g, '\r')
            r.findText(code)
            r.select()
            break
        case (9)    :
            if (sel.getClientRects().length &gt; 1){
                code = sel.text
                tmp = sel.duplicate()
                tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
                // 出错检验代码~~~~~~
                if(sel.parentElement() != tmp.parentElement()) return;
                sel.setEndPoint('startToStart', tmp)
                sel.text = '\t'+sel.text.replace(/\r\n/g, '\r\t')
                code = code.replace(/\r\n/g, '\r\t')
                r.findText(code)
                r.select()
            }else{
                sel.text = '\t'
                sel.select()
            }
            break
        case (13)    :
            tmp = sel.duplicate()
            tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top)
            // 出错检验代码~~~~~~
            if(sel.parentElement() != tmp.parentElement()) return;
            tmp.setEndPoint('endToEnd', sel)
            for (var i=0; tmp.text.match(/^[\t]+/g) &amp;&amp; i&lt;tmp.text.match(/^[\t]+/g)[0].length; i++)    tabs += '\t'
            sel.text = '\r\n'+tabs
            sel.select()
            break
        default        :
            event.returnValue = true
            break;
    }
    return;
}


function runcode() {
    var str = document.getElementById("txt_main").value;
    var code_win = window.open('about:blank');
    code_win.document.open();
    code_win.document.writeln("&lt;script&gt;");
    code_win.document.writeln("function reportError(msg,url,line){\nline-=14;\nvar str='You have found an error as below: \\n\\n';\nstr+='Err: '+msg+' on line: '+(line);\nalert(str);\nopener.goto(line);\nopener.focus();\nwindow.onerror=null;\nsetTimeout('self.close()',10);\nreturn true;\n}");
    code_win.document.writeln("window.onerror = reportError;");
    code_win.document.writeln("&lt;\/script&gt;");
    code_win.document.writeln(str);
    code_win.document.close();
    return;
}


function savecode() {
    var str = document.getElementById("txt_main").value;
    var code_win = window.open('about:blank','_blank','top=10000');
    code_win.document.open();
    code_win.document.writeln(str);
    code_win.document.close();
    code_win.document.execCommand('saveas','','code.html');
    code_win.close();
    return;
}


function goto(ln) {
    if(!/^\d+$/.test(ln)) return;
    var obj = document.getElementById("txt_main");
    var rng = obj.createTextRange();
    var arr = obj.value.replace(/\r/, "").split(/\n/);
    if(ln&gt;arr.length) ln = arr.length;
    var str_tmp = "";
    for(var i=0; i&lt;ln-1; i++) {
        str_tmp += arr[i];
    }
    rng.moveStart('character',str_tmp.length+1);
    str_tmp = "";
    for(i=ln; i&lt;arr.length; i++) {
        str_tmp += arr[i];
    }
    rng.moveEnd('character',-str_tmp.length); 
    rng.select();
    return;
}

window.onload = function() {document.getElementById("txt_main").value = "&lt;script&gt;\nalert(')\n&lt;\/script&gt;";}
&lt;/script&gt;
&lt;BODY&gt;
&lt;table width='600' class='list' border='1' bgcolor='#eeeeee' bordercolorlight='#000000' bordercolordark='#FFFFFF' cellpadding='0' cellspacing='0'&gt;
  &lt;tr bgcolor='#cccccc'&gt; 
    &lt;td colspan='2' height='20' align='center'&gt;&lt;b&gt;Debug Textarea&lt;/b&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt; 
    &lt;td colspan='2'&gt;
        &lt;table width='95%' border='0' align='center' &gt;
      &lt;tr&gt; 
        &lt;td align='center'&gt;&lt;br /&gt;
          &lt;textarea id='txt_ln' name='content' rows='10' style='width:40px;overflow:hidden;height:200px;border-right:0px;text-align:right;line-height:14px' onselectstart='this.nextSibling.focus();return false' readonly&gt;&lt;/textarea&gt;&lt;textarea id='txt_main' name='content' rows='10' cols='80' onkeydown='editTab()' onkeyup='show_ln()' onscroll='show_ln()' wrap='off' style='overflow:auto;height:200px;padding-left:5px;border-left:0px;line-height:14px'&gt;&lt;/textarea&gt;
          &lt;script&gt;for(var i=1; i&lt;=20; i++) document.getElementById('txt_ln').value += i + '\n';&lt;/script&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
          &lt;tr&gt; 
            &lt;td align='center'&gt;&lt;br /&gt;
              &lt;input type='button' value=' 运 行 ' onclick='runcode()' accesskey='r'&gt;&amp;nbsp;&amp;nbsp;
              &lt;input type='button' value=' 保 存 ' onclick='savecode()' accesskey='s'&gt;&amp;nbsp;&amp;nbsp;
              &lt;input type='button' value=' 跳 转 ' onclick="goto(prompt('Please input the line number', '1'))"  accesskey='g'&gt;&amp;nbsp;&amp;nbsp;
			  &lt;input type='button' value=' 清 空 ' onclick='txt_main.value=""' accesskey='c'&gt;&amp;nbsp;&amp;nbsp;
            &lt;/td&gt;
          &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
</textarea><br /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行] </p>
<img src ="http://www.blogjava.net/wjywilliam/aggbug/82094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjywilliam/" target="_blank">wjywilliam</a> 2006-11-19 20:43 <a href="http://www.blogjava.net/wjywilliam/archive/2006/11/19/82094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>