﻿<?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/tangzurui/category/31601.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 01 Jul 2011 06:10:08 GMT</lastBuildDate><pubDate>Fri, 01 Jul 2011 06:10:08 GMT</pubDate><ttl>60</ttl><item><title>fckeditor   更改图片上传路径为绝对路径,java-core-2.4.jar  </title><link>http://www.blogjava.net/tangzurui/archive/2011/06/29/353330.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Wed, 29 Jun 2011 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/tangzurui/archive/2011/06/29/353330.html</guid><wfw:comment>http://www.blogjava.net/tangzurui/comments/353330.html</wfw:comment><comments>http://www.blogjava.net/tangzurui/archive/2011/06/29/353330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tangzurui/comments/commentRss/353330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tangzurui/services/trackbacks/353330.html</trackback:ping><description><![CDATA[<div>
<div>在网上找了好久都没有找到完全解决这个问题的办法，只好自己试着去改。<br />目的是更改fckeditor的上传图片到另一个工程中，避免每次更新项目版本时都要重新把附件拷贝一次<br /><br /><br />首先找到fckeditor.properties<br />在其中加入<br /></div>
<p><span>&nbsp;&nbsp; #上传文件的绝对路径&nbsp;(上传时用到的目录)</span></p>
<p><span>&nbsp;&nbsp; connector.userFilesAbsolutePath&nbsp;=&nbsp;D:/temp/image</span></p>
<p><span>&nbsp;&nbsp; #在web上使用文件时的虚拟目录 &nbsp;&nbsp;（读取图片时用到）</span></p>
<p><span>&nbsp;&nbsp; connector.userFilesPath&nbsp;=&nbsp;<a href="http://localhost:8080/temp">http:</span><span class="comment"><font color="#008200">//localhost:8080/temp</a>&nbsp;<br /><br /></font></span><span>&nbsp;&nbsp;</span></span></p>
<div>更改ConnectorServlet类中的doGet()方法<br />&nbsp; 找到以下代码<br />//&nbsp;&nbsp;&nbsp;String typePath = UtilsFile.constructServerSidePath(request, resourceType);<br />//&nbsp;&nbsp;&nbsp;String typeDirPath = getServletContext().getRealPath(typePath);<br />&nbsp;&nbsp;&nbsp; 更改以上两行代码为：<br />&nbsp;&nbsp; String typePath=D:/temp/image;<br />&nbsp;&nbsp;&nbsp;String typeDirPath =D:/temp/image;<br /><br />doPost()方法同doGet方法一样更改同样的代码<br /><br /><br />三、找到<font face="Verdana">fckeditor\editor\filemanager\browser\default</font>\frmresourceslist.html文件<br />&nbsp; 找到以下代码:<br />&nbsp;&nbsp; var sCurrentFolderPath&nbsp;= oFolderNode.attributes.getNamedItem('path').value ;<br />&nbsp;&nbsp; var sCurrentFolderUrl&nbsp;= oFolderNode.attributes.getNamedItem('url').value ;<br />&nbsp;&nbsp; 再其下方增加<br />&nbsp;&nbsp; var num = sCurrentFolderUrl.indexOf('http');<br />&nbsp;&nbsp;&nbsp; sCurrentFolderUrl =sCurrentFolderUrl.substring(num,sCurrentFolderUrl.lenght);<br /><br /><br />四。&nbsp; 找到文件fckeditor\editor\dialog\fck_image\fck_image.js<br />&nbsp;&nbsp; 更改方法:<br />&nbsp;&nbsp; function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg ){}<br />&nbsp;&nbsp; 在switch ( errorNumber )这行代码上面增加以下代码：<br />&nbsp;&nbsp; var num = fileUrl.indexOf('http');<br />&nbsp; &nbsp;fileUrl =fileUrl.substring(num,fileUrl.lenght);<br /><br />===========this over .....<br /><br /><br />以上就是更改为绝对路径的整个过程，也许有更好的办法，期待其出现....<br /><br /></div></div><img src ="http://www.blogjava.net/tangzurui/aggbug/353330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tangzurui/" target="_blank">梓枫</a> 2011-06-29 10:19 <a href="http://www.blogjava.net/tangzurui/archive/2011/06/29/353330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Collections.sort() 对 List 排序 </title><link>http://www.blogjava.net/tangzurui/archive/2009/03/16/260115.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Mon, 16 Mar 2009 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/tangzurui/archive/2009/03/16/260115.html</guid><wfw:comment>http://www.blogjava.net/tangzurui/comments/260115.html</wfw:comment><comments>http://www.blogjava.net/tangzurui/archive/2009/03/16/260115.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tangzurui/comments/commentRss/260115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tangzurui/services/trackbacks/260115.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> User {<br /> String name;<br /> String age;<br /> <br /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> User(String name,String age){<br />  </span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000">.name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">name;<br />  </span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000">.age</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">age;<br /> }<br /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> String getAge() {<br />  </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> age;<br /> }<br /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> setAge(String age) {<br />  </span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000">.age </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> age;<br /> }<br /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> String getName() {<br />  </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> name;<br /> }<br /> </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> setName(String name) {<br />  </span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000">.name </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> name;<br /> } <br />}<br /><br /></span>
		</div>
		<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: #000000">public class SortTest { </span>
				<br />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> main(String[] args){<br />  List userlist</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> ArrayList();<br />  userlist.add(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> User(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">dd</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));<br />  userlist.add(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> User(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">aa</span>
				<span style="COLOR: #000000">"</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: #000000">));<br />  userlist.add(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> User(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ee</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));<br />  userlist.add(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> User(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">bb</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));  <br />  userlist.add(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> User(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">ff</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));<br />  userlist.add(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> User(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">cc</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));<br />  userlist.add(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> User(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">gg</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">6</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));<br />   <br />Collections.sort(userlist,</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> Comparator</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">User</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">(){<br /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> compare(User arg0, User arg1) {<br />                  User user0</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">(User)arg0;<br />                  User user1</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">(User)arg1;<br />                  </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">首先比较年龄，如果年龄相同，则比较名字</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">                  </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> flag</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">user0.getAge().compareTo(user1.getAge());<br />                  </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">(flag</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">){<br />                   </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> user0.getName().compareTo(user1.getName());<br />                  }</span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000">{<br />                   </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> flag;<br />                  }  <br />                 }<br /><br />        });<br />   <br />  </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">0</span>
				<span style="COLOR: #000000">;i</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">userlist.size();i</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">){<br />   User user_temp</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">(User)userlist.get(i);<br />      System.out.println(user_temp.getAge()</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">user_temp.getName()); <br />  }<br />  <br /> }<br />}<br /><br /> </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">首先比较年龄，如果年龄相同，则比较名字</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">
						<br />结果:<br />   </span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">, aa<br />   </span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">, bb<br />   </span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">, cc<br />   </span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">, dd<br />   </span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">, ee<br />   </span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">, ff<br />   </span>
				<span style="COLOR: #000000">6</span>
				<span style="COLOR: #000000">, gg</span>
		</div>
<img src ="http://www.blogjava.net/tangzurui/aggbug/260115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tangzurui/" target="_blank">梓枫</a> 2009-03-16 22:19 <a href="http://www.blogjava.net/tangzurui/archive/2009/03/16/260115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>    -------------格式化输出-------------</title><link>http://www.blogjava.net/tangzurui/archive/2009/03/02/257420.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Mon, 02 Mar 2009 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/tangzurui/archive/2009/03/02/257420.html</guid><wfw:comment>http://www.blogjava.net/tangzurui/comments/257420.html</wfw:comment><comments>http://www.blogjava.net/tangzurui/archive/2009/03/02/257420.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tangzurui/comments/commentRss/257420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tangzurui/services/trackbacks/257420.html</trackback:ping><description><![CDATA[
		<font size="3">
				<span style="FONT-SIZE: medium"> <span class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">System</font></span>.<span class="hilite2"><font style="BACKGROUND-COLOR: #55ff55">out</font></span>.<span class="hilite3"><font style="BACKGROUND-COLOR: #aaffaa">format</font></span>("%b\n",new Date());</span>
		</font>
		<p>
		</p>
		<p>
		</p>
		<p style="TEXT-ALIGN: left">
				<span style="FONT-SIZE: medium">
						<font size="3">对于b(布尔类型)来说：</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left">
				<span style="FONT-SIZE: medium">
						<font size="3">如果是<span style="COLOR: #ff0000"><strong>字符，字符串，数字，对象</strong></span>为true；</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left">
				<span style="FONT-SIZE: medium">
						<font size="3">如果是<span style="COLOR: #0000ff; BACKGROUND-COLOR: #ffffff"><strong>NULL</strong></span>，则为FALSE<br /></font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left">
				<br />
				<br />  <span class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">System</font></span>.<span class="hilite2"><font style="BACKGROUND-COLOR: #55ff55">out</font></span>.<span class="hilite3"><font style="BACKGROUND-COLOR: #aaffaa">format</font></span>("%c\n",new Integer(50));</p>
		<p style="TEXT-ALIGN: left">对于字符类型来说：</p>
		<p style="TEXT-ALIGN: left">只能是：<span style="COLOR: #ff0000"><strong>byte， int， short，字符,对应的包装类</strong></span></p>
		<p style="TEXT-ALIGN: left">其他的则报告错误</p>
		<p style="TEXT-ALIGN: left"> </p>
		<p style="TEXT-ALIGN: left">
				<br />  <span class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">System</font></span>.<span class="hilite2"><font style="BACKGROUND-COLOR: #55ff55">out</font></span>.printf("%d\n",new Long("99"));</p>
		<p style="TEXT-ALIGN: left">对于整型数据来说：</p>
		<p style="TEXT-ALIGN: left">如下：<span style="COLOR: #ff0000"><strong>byte short int long</strong></span> 及其<strong><span style="COLOR: #ff0000">包装类</span></strong>都可以 但<span style="COLOR: #0000ff"><strong>float double</strong></span> 不可以</p>
		<p style="TEXT-ALIGN: left"> </p>
		<p style="TEXT-ALIGN: left">
				<br />  <span class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">System</font></span>.<span class="hilite2"><font style="BACKGROUND-COLOR: #55ff55">out</font></span>.printf("%f\n",123.00)；</p>
		<p style="TEXT-ALIGN: left">对于浮点类型来说：必须是<span style="COLOR: #ff0000"><strong>float </strong></span>或者是 <span style="COLOR: #ff0000"><strong>double</strong></span>   ，其他都不可以</p>
		<p style="TEXT-ALIGN: left"> </p>
		<p style="TEXT-ALIGN: left">
				<br />  <span class="hilite1"><font style="BACKGROUND-COLOR: #ffff00">System</font></span>.<span class="hilite2"><font style="BACKGROUND-COLOR: #55ff55">out</font></span>.<span class="hilite3"><font style="BACKGROUND-COLOR: #aaffaa">format</font></span>("%s",'p');</p>
		<font size="4">
				<p style="TEXT-ALIGN: left">对于字符来说：<span style="COLOR: #ff0000"><strong>字符串，数字，对象</strong></span>都可以。其实就是用字符串描述参量</p>
		</font>
		<p style="TEXT-ALIGN: left"> </p>
<img src ="http://www.blogjava.net/tangzurui/aggbug/257420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tangzurui/" target="_blank">梓枫</a> 2009-03-02 22:00 <a href="http://www.blogjava.net/tangzurui/archive/2009/03/02/257420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String.split()</title><link>http://www.blogjava.net/tangzurui/archive/2008/10/10/233548.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Fri, 10 Oct 2008 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/tangzurui/archive/2008/10/10/233548.html</guid><wfw:comment>http://www.blogjava.net/tangzurui/comments/233548.html</wfw:comment><comments>http://www.blogjava.net/tangzurui/archive/2008/10/10/233548.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tangzurui/comments/commentRss/233548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tangzurui/services/trackbacks/233548.html</trackback:ping><description><![CDATA[
		<div class="cnt">在应用中用到一些，给大家总结一下，仅供大家参考：<br />1、如果用“.”作为分隔的话，必须是如下写法：String.split("\\."),这样才能正确的分隔开，不能用String.split(".");<br />2、如果用“|”作为分隔的话，必须是如下写法：String.split("\\|"),这样才能正确的分隔开，不能用String.split("|");<br />“.”和“|”都是转义字符，必须得加"\\";<br />3、如果在一个字符串中有多个分隔符，可以用“|”作为连字符，比如：“acount=? and uu =? or n=?”,把三个都分隔出来，可以用String.split("and|or");</div>
<img src ="http://www.blogjava.net/tangzurui/aggbug/233548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tangzurui/" target="_blank">梓枫</a> 2008-10-10 11:33 <a href="http://www.blogjava.net/tangzurui/archive/2008/10/10/233548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA反射机制</title><link>http://www.blogjava.net/tangzurui/archive/2008/08/11/221247.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Mon, 11 Aug 2008 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/tangzurui/archive/2008/08/11/221247.html</guid><wfw:comment>http://www.blogjava.net/tangzurui/comments/221247.html</wfw:comment><comments>http://www.blogjava.net/tangzurui/archive/2008/08/11/221247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tangzurui/comments/commentRss/221247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tangzurui/services/trackbacks/221247.html</trackback:ping><description><![CDATA[JAVA反射机制<br />    JAVA反射机制是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；对于任意一个对象，都能够调用它的任意一个方法；这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。<br />Java反射机制主要提供了以下功能： 在运行时判断任意一个对象所属的类；在运行时构造任意一个类的对象；在运行时判断任意一个类所具有的成员变量和方法；在运行时调用任意一个对象的方法；生成动态代理。<br />1. 得到某个对象的属性<br /><br />1 public Object getProperty(Object owner, String fieldName) throws Exception {<br />2     Class ownerClass = owner.getClass();<br />3 <br />4     Field field = ownerClass.getField(fieldName);<br />5 <br />6     Object property = field.get(owner);<br />7 <br />8     return property;<br />9 }<br />Class ownerClass = owner.getClass()：得到该对象的Class。<br /><br />Field field = ownerClass.getField(fieldName)：通过Class得到类声明的属性。<br /><br />Object property = field.get(owner)：通过对象得到该属性的实例，如果这个属性是非公有的，这里会报IllegalAccessException。<br /><br />2. 得到某个类的静态属性<br /><br /> 1 public Object getStaticProperty(String className, String fieldName)<br /> 2             throws Exception {<br /> 3     Class ownerClass = Class.forName(className);<br /> 4 <br /> 5     Field field = ownerClass.getField(fieldName);<br /> 6 <br /> 7     Object property = field.get(ownerClass);<br /> 8 <br /> 9     return property;<br />10 }<br /><br />Class ownerClass = Class.forName(className) ：首先得到这个类的Class。<br /><br />Field field = ownerClass.getField(fieldName)：和上面一样，通过Class得到类声明的属性。<br /><br />Object property = field.get(ownerClass) ：这里和上面有些不同，因为该属性是静态的，所以直接从类的Class里取。<br /><br />3. 执行某对象的方法<br /><br /> 1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {<br /> 2 <br /> 3     Class ownerClass = owner.getClass();<br /> 4 <br /> 5     Class[] argsClass = new Class[args.length];<br /> 6 <br /> 7     for (int i = 0, j = args.length; i &lt; j; i++) {<br /> 8         argsClass[i] = args[i].getClass();<br /> 9     }<br />10 <br />11     Method method = ownerClass.getMethod(methodName, argsClass);<br />12 <br />13     return method.invoke(owner, args);<br />14 }<br />Class owner_class = owner.getClass() ：首先还是必须得到这个对象的Class。<br /><br />5～9行：配置参数的Class数组，作为寻找Method的条件。<br /><br />Method method = ownerClass.getMethod(methodName, argsClass)：通过Method名和参数的Class数组得到要执行的Method。<br /><br />method.invoke(owner, args)：执行该Method，invoke方法的参数是执行这个方法的对象，和参数数组。返回值是Object，也既是该方法的返回值。<br /><br />4. 执行某个类的静态方法<br /><br /> 1 public Object invokeStaticMethod(String className, String methodName,<br /> 2             Object[] args) throws Exception {<br /> 3     Class ownerClass = Class.forName(className);<br /> 4 <br /> 5     Class[] argsClass = new Class[args.length];<br /> 6 <br /> 7     for (int i = 0, j = args.length; i &lt; j; i++) {<br /> 8         argsClass[i] = args[i].getClass();<br /> 9     }<br />10 <br />11     Method method = ownerClass.getMethod(methodName, argsClass);<br />12 <br />13     return method.invoke(null, args);<br />14 }<br /><br />基本的原理和实例3相同，不同点是最后一行，invoke的一个参数是null，因为这是静态方法，不需要借助实例运行。<br /><br />5. 新建实例<br /> 1 <br /> 2 public Object newInstance(String className, Object[] args) throws Exception {<br /> 3     Class newoneClass = Class.forName(className);<br /> 4 <br /> 5     Class[] argsClass = new Class[args.length];<br /> 6 <br /> 7     for (int i = 0, j = args.length; i &lt; j; i++) {<br /> 8         argsClass[i] = args[i].getClass();<br /> 9     }<br />10 <br />11     Constructor cons = newoneClass.getConstructor(argsClass);<br />12 <br />13     return cons.newInstance(args);<br />14 <br />15 }<br /><br />这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数，可以直接使用newoneClass.newInstance()来实现。<br /><br />Class newoneClass = Class.forName(className)：第一步，得到要构造的实例的Class。<br /><br />第5～第9行：得到参数的Class数组。<br /><br />Constructor cons = newoneClass.getConstructor(argsClass)：得到构造子。<br /><br />cons.newInstance(args)：新建实例。<br /><br />6. 判断是否为某个类的实例<br /><br />1 public boolean isInstance(Object obj, Class cls) {<br />2     return cls.isInstance(obj);<br />3 }<br /><br />7. 得到数组中的某个元素<br />1 public Object getByArray(Object array, int index) {<br />2     return Array.get(array,index);<br />3 }<br /><img src ="http://www.blogjava.net/tangzurui/aggbug/221247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tangzurui/" target="_blank">梓枫</a> 2008-08-11 11:23 <a href="http://www.blogjava.net/tangzurui/archive/2008/08/11/221247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet中配置文件web.xml中的参数context-param和init-param区</title><link>http://www.blogjava.net/tangzurui/archive/2008/07/29/218469.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Tue, 29 Jul 2008 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/tangzurui/archive/2008/07/29/218469.html</guid><wfw:comment>http://www.blogjava.net/tangzurui/comments/218469.html</wfw:comment><comments>http://www.blogjava.net/tangzurui/archive/2008/07/29/218469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tangzurui/comments/commentRss/218469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tangzurui/services/trackbacks/218469.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt" id="blog_text">web.xml里面可以定义两种参数：<br />(1)application范围内的参数，存放在servletcontext中，在web.xml中配置如下： 
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span></span><span>&lt;</span><span>context-param</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />           </span><span>&lt;</span><span>param-name</span><span>&gt;</span><span>context/param</span><span>&lt;/</span><span>param-name</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />           </span><span>&lt;</span><span>param-value</span><span>&gt;</span><span>avalible during application</span><span>&lt;/</span><span>param-value</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />  </span><span>&lt;/</span><span>context-param</span><span>&gt;</span></div></div><p>(2)servlet范围内的参数，只能在servlet的init()方法中取得，在web.xml中配置如下：</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span></span><span>&lt;</span><span>servlet</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />    </span><span>&lt;</span><span>servlet-name</span><span>&gt;</span><span>MainServlet</span><span>&lt;/</span><span>servlet-name</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />    </span><span>&lt;</span><span>servlet-class</span><span>&gt;</span><span>com.wes.controller.MainServlet</span><span>&lt;/</span><span>servlet-class</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />    </span><span>&lt;</span><span>init-param</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />       </span><span>&lt;</span><span>param-name</span><span>&gt;</span><span>param1</span><span>&lt;/</span><span>param-name</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />       </span><span>&lt;</span><span>param-value</span><span>&gt;</span><span>avalible in servlet init()</span><span>&lt;/</span><span>param-value</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />    </span><span>&lt;/</span><span>init-param</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />    </span><span>&lt;</span><span>load-on-startup</span><span>&gt;</span><span>0</span><span>&lt;/</span><span>load-on-startup</span><span>&gt;</span><span><br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span>&lt;/</span><span>servlet</span><span>&gt;</span></div></div><p>在servlet中可以通过代码分别取用：<br /><br /><span></span></p><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 src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.wes.controller;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.ServletException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServlet;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_156_541_Open_Image" onclick="this.style.display='none'; Codehighlighter1_156_541_Open_Text.style.display='none'; Codehighlighter1_156_541_Closed_Image.style.display='inline'; Codehighlighter1_156_541_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_156_541_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_156_541_Closed_Text.style.display='none'; Codehighlighter1_156_541_Open_Image.style.display='inline'; Codehighlighter1_156_541_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> MainServlet </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> HttpServlet </span><span id="Codehighlighter1_156_541_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"></span><span id="Codehighlighter1_156_541_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_187_212_Open_Image" onclick="this.style.display='none'; Codehighlighter1_187_212_Open_Text.style.display='none'; Codehighlighter1_187_212_Closed_Image.style.display='inline'; Codehighlighter1_187_212_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_187_212_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_187_212_Closed_Text.style.display='none'; Codehighlighter1_187_212_Open_Image.style.display='inline'; Codehighlighter1_187_212_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> MainServlet() </span><span id="Codehighlighter1_187_212_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"></span><span id="Codehighlighter1_187_212_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">super</span><span style="COLOR: #000000">();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_264_539_Open_Image" onclick="this.style.display='none'; Codehighlighter1_264_539_Open_Text.style.display='none'; Codehighlighter1_264_539_Closed_Image.style.display='inline'; Codehighlighter1_264_539_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_264_539_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_264_539_Closed_Text.style.display='none'; Codehighlighter1_264_539_Open_Image.style.display='inline'; Codehighlighter1_264_539_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> init() </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> ServletException </span><span id="Codehighlighter1_264_539_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"></span><span id="Codehighlighter1_264_539_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">下面的两个参数param1是在servlet中存放的</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          System.out.println(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.getInitParameter(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">param1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">下面的参数是存放在servletcontext中的</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          System.out.println(getServletContext().getInitParameter(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">context/param</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />       }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></p><p>第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到<br />第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取</p></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/tangzurui/aggbug/218469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tangzurui/" target="_blank">梓枫</a> 2008-07-29 16:32 <a href="http://www.blogjava.net/tangzurui/archive/2008/07/29/218469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可变参数</title><link>http://www.blogjava.net/tangzurui/archive/2008/07/25/217518.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Fri, 25 Jul 2008 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/tangzurui/archive/2008/07/25/217518.html</guid><wfw:comment>http://www.blogjava.net/tangzurui/comments/217518.html</wfw:comment><comments>http://www.blogjava.net/tangzurui/archive/2008/07/25/217518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tangzurui/comments/commentRss/217518.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tangzurui/services/trackbacks/217518.html</trackback:ping><description><![CDATA[
		<strong>
				<span style="FONT-SIZE: 20px">第五章“可变参数”</span>
				<br />
				<br />
		</strong>方法重载是Java和其他面向对象语言最具特色的特性之一。当许多人可能认为Java的优势是它的类型，或者是它所带的API库，其实让相同的方法名与各种各样可接受的参数搭配也是一件很好的事。<br /><br /><br /><pre class="overflow">Guitar guitar = new Guitar("Bourgeois", "Country Boy Deluxe",<br />GuitarWood.MAHOGANY, GuitarWood.ADIRONDACK,1.718);<br />Guitar guitar = new Guitar("Martin", "HD-28");<br />Guitar guitar = new Guitar("Collings", "CW-28"<br />GuitarWood.BRAZILIAN_ROSEWOOD, GuitarWood.ADIRONDACK,1.718,<br />GuitarInlay.NO_INLAY, GuitarInlay.NO_INLAY);<br /><br />This code calls three versions of the constructor of a (fictional) Guitar class, meaning that information can be supplied when it’s available,rather than forcing a user to know everything about their guitar at one time (many professionals couldn’t tell you their guitar’s width at the nut).<br />Here are the constructors used:<br />public Guitar(String builder, String model) {<br />}<br />public Guitar(String builder, String model,<br />GuitarWood backSidesWood, GuitarWood topWood,<br />float nutWidth) {<br />}<br />public Guitar(String builder, String model,<br />GuitarWood backSidesWood, GuitarWood topWood,<br />float nutWidth,<br />GuitarInlay fretboardInlay, GuitarInlay topInlay) {<br />}</pre><br /><br />这段代码调用了Guitar类中三个版本的构造器，意味着当信息可见时，这些信息会被支持，而不是迫使每一个使用者每一次都要去了解关于Guitar类的所有知识。许多专家不会在关键时候告诉你他们的Guitar的内容。下面是用到的构造器：<br /><br /><pre class="overflow">public Guitar(String builder, String model) {<br />}<br />public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth) {<br />}<br />public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,<br />GuitarInlay fretboardInlay, GuitarInlay topInlay) {<br />}</pre><br /><br /><br />然而，当你想要去增加无限的信息时，事情开始变得有一点不是那么有用了。例如：假设你想允许在这个构造器中增加额外的未指明的特性。下面就是一些可能的调用的例子：<br /><br /><pre class="overflow">Guitar guitar = new Guitar("Collings", "CW-28"<br />GuitarWood.BRAZILIAN_ROSEWOOD, GuitarWood.ADIRONDACK,1.718,<br />GuitarInlay.NO_INLAY, GuitarInlay.NO_INLAY,"Enlarged Soundhole", "No Popsicle Brace");<br />Guitar guitar = new Guitar("Martin", "HD-28V","Hot-rodded by Dan Lashbrook", "Fossil Ivory Nut","Fossil Ivory Saddle", "Low-profile bridge pins");</pre><br /><br />对于这两个单独的情况，你不得不去增加一个构造器来接受两个额外的字符串，另外一个构造器来接受四个额外的字符串。试图将这些相似的版本应用于早已重载的构造器。根据这样的话，你最终会得到20或30个那样愚蠢的构造器的版本！<br /><br />原因在于我们常称做的可变参数。可变参数是Tiger的增加的另一个特性，它用一种相当巧妙的方法彻底地解决了这儿提出的问题。这一章讲述了这种相对简单的特性的各个方面。这将会使你迅速写出更好、更整洁、更灵活的代码。<br /><br /><b><span style="FONT-SIZE: 16px">创建一个可变长度的参数列表</span></b><br /><br />可变参数使得你可以指定某方法来接受多个同一类型的参数，而且并不要求事先确定参数的数量（在编译或运行时）。<br />这就是Tiger的一个集成部分。事实上，正是因为Java语言的一些新特性组合在一起才表现出了可变参数的特性。<br /><br /><b>我如何去实现呢？</b><br />首先，你要习惯的书写省略号（。。。）。这三个小点是可变参数的关键，你将会经常键入它们。下面是Guitar类的构造器使用可变参数来接受不确定数量字符串的一个例子：<br /><br /><pre class="overflow">public Guitar(String builder, String model, String...features);</pre><br /><br />参数String... features 表明任何数量的字符串都可能被接受。 所以，下面所有的调用都合法的。<br /><br /><pre class="overflow">Guitar guitar = new Guitar("Martin", "HD-28V","Hot-rodded by Dan Lashbrook", "Fossil Ivory Nut","Fossil Ivory Saddle", "Low-profile bridge pins");<br />Guitar guitar = new Guitar("Bourgeois", "OMC","Incredible flamed maple bindings on this one.");<br />Guitar guitar = new Guitar("Collings", "OM-42","Once owned by Steve Kaufman--one of a kind");<br />You could add the same variable-length argument to the other constructors:<br />public Guitar(String builder, String model,<br />GuitarWood backSidesWood, GuitarWood topWood,float nutWidth, String... features)<br />public Guitar(String builder, String model,<br />GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,<br />GuitarInlay fretboardInlay,GuitarInlay topInlay,String... features)</pre><br /><br />例5-1描写了一个把所有的这些特性放在一起的简单类，甚至使用XX来一起传递一些可变参数。<br />Example 5-1. Using varargs in constructors<br /><br /><pre class="overflow">package com.oreilly.tiger.ch05;<br />public class Guitar {<br />private String builder;<br />private String model;<br />private float nutWidth;<br />private GuitarWood backSidesWood;<br />private GuitarWood topWood;<br />private GuitarInlay fretboardInlay;<br />private GuitarInlay topInlay;<br />private static final float DEFAULT_NUT_WIDTH = 1.6875f;<br />public Guitar(String builder, String model, String... features) {<br />this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);<br />}<br />public Guitar(String builder, String model,<br />GuitarWood backSidesWood, GuitarWood topWood,<br />float nutWidth, String... features) {<br />this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);<br />}<br />public Guitar(String builder, String model,<br />GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,<br />GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {<br />this.builder = builder;<br />this.model = model;<br />this.backSidesWood = backSidesWood;<br />this.topWood = topWood;<br />this.nutWidth = nutWidth;<br />this.fretboardInlay = fretboardInlay;<br />this.topInlay = topInlay;<br />}<br />}</pre><br /><br /><b>刚才发生了什么?</b><br />当你指定了一个可变长度参数列表,Java编译器实际上读入 “create an array of type &lt;参数类型&gt;”。你键入：<br /><br /><pre class="overflow">public Guitar(String builder, String model, String... features)</pre><br /><br />然而：编译器解释这些为：<br /><pre class="overflow">public Guitar(String builder, String model, String[] features)</pre><br /><br />这意味着重复参数列表变得简单（这将在“重复可变长度参数列表”里讲述），这与你需要完成的其他程序设计目标是一样。<br />你可以像使用数组一样来使用可变参数。<br />然而，这同样存在一些限制。第一，在每个方法中，你只可以使用一次省略号。所以，下面的书写是不合法的：<br /><pre class="overflow">public Guitar(String builder, String model,<br />String... features, float... stringHeights)</pre><br /><br />另外，省略号必须作为方法的最后一个参数。<br /><br /><br /><b>如果你不需要传递任何可变参数呢？</b><br />那没关系，你只需要以旧的方式调用构造器：<br /><pre class="overflow">Guitar guitar = new Guitar("Martin", "D-18");</pre><br /><br />我们再仔细看看，虽然程序中没有与下面代码相匹配的构造器：<br /><pre class="overflow">public Guitar(String builder, String model)</pre><br /><br />那么，代码到底传递了什么呢？作为可变参数的特例，在参数中不传递东西是一个合法的选项。所以，当你看到 String... features，你应该把它认为是零个或者更多个String参数。这省却你再去创建另一个不带可变参数构造器的麻烦。<br /><br /><b><span style="FONT-SIZE: 16px">重复可变长度参数类表</span></b><br /><br />所有这些可变参数是很好的。但是实际上，如果你不在你的方法中使用它们的话，他们显然仅仅是吸引眼球的东西或是窗户的装饰品而已。<br />然而，你可以像你使用数组一样来使用可变参数，你会觉得这种用法很简单。<br /><br /><b>那我怎么来使用可变参数呢？</b><br />首先你要确保阅读了“创建一个可变长度的参数列表”，你会从中了解到可变参数方法最重要的东西，那就是我们把可变参数当作数组来看待。<br />所以，继续前面的例子，你可以写出下面的代码：<br /><pre class="overflow">public Guitar(String builder, String model,<br />GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,<br />GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {<br />this.builder = builder;<br />this.model = model;<br />this.backSidesWood = backSidesWood;<br />this.topWood = topWood;<br />this.nutWidth = nutWidth;<br />this.fretboardInlay = fretboardInlay;<br />this.topInlay = topInlay;<br />for (String feature : features) {<br />System.out.println(feature);<br />}<br />}</pre><br /><br />上面的这段代码看上是不是不是那么的有吸引力？但这确实体现了可变参数的精髓。作为另一个例子，下面这个简单的方法从一组数字中计算出最大值：<br /><pre class="overflow">public static int max(int first, int... rest) {<br />int max = first;<br />for (int i : rest) {<br />if (i &gt; max)<br />max = i;<br />}<br />return max;<br />}</pre><br /><br />是不是，够简单吧？<br /><br /><br /><b>那么如何存储可变长度参数呢？</b><br />正因为Java编译器把这些看作数组，所以数组显然是一个存储的好选择，这将在下面的例5-2中体现。<br />Example 5-2. 存储作为成员变量的可变参数<br /><pre class="overflow">package com.oreilly.tiger.ch05;<br />public class Guitar {<br />private String builder;<br />private String model;<br />private float nutWidth;<br />private GuitarWood backSidesWood;<br />private GuitarWood topWood;<br />private GuitarInlay fretboardInlay;<br />private GuitarInlay topInlay;<br />private String[] features;<br />private static final float DEFAULT_NUT_WIDTH = 1.6875f;<br />public Guitar(String builder, String model, String... features) {<br />this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);<br />}<br />public Guitar(String builder, String model,<br />GuitarWood backSidesWood, GuitarWood topWood,<br />float nutWidth, String... features) {<br />this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);<br />}<br />public Guitar(String builder, String model,<br />GuitarWood backSidesWood, GuitarWood topWood,<br />float nutWidth,<br />GuitarInlay fretboardInlay, GuitarInlay topInlay,<br />String... features) {<br />this.builder = builder;<br />this.model = model;<br />this.backSidesWood = backSidesWood;<br />this.topWood = topWood;<br />this.nutWidth = nutWidth;<br />this.fretboardInlay = fretboardInlay;<br />this.topInlay = topInlay;<br />this.features = features;<br />}<br />}</pre><br /><br />你可以简单地在Java的Collection类中存储这些可变参数。<br /><pre class="overflow">//变量声明<br />private List features;<br />//在方法中或是构造器中的书写<br />this.features = java.util.Arrays.asList(features);</pre><br /><br /><b><span style="FONT-SIZE: 16px">允许零长度的参数列表</span></b><br />可变参数的一个显著的特性是可变长度参数可以接受零到N个参数。这就意味着你可以调用这些方法中的一个方法而不传递任何参数，程序同样可以运行。从另一方面来说，这又意味着，作为一个程序员，你最好意识到你必须防范这种情况的发生。<br /><br /><b>如何实现它呢？</b><br />记得在“重复可变长度参数类表”中，你读到过下面这个简单的方法：<br /><pre class="overflow">public static int max(int first, int... rest) {<br />int max = first;<br />for (int i : rest) {<br />if (i &gt; max)<br />max = i;<br />}<br />return max;<br />}</pre><br /><br />你可以以多种形式来调用这个方法：<br /><pre class="overflow">int max = MathUtils.max(1, 4);<br />int max = MathUtils.max(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);<br />int max = MathUtils.max(18, 8, 4, 2, 1, 0);</pre><br /><br /><br />有一点不是那么令人满意的地方是，在很多情况下，你要传递的数字已经存储在数组里，或是至少是在某些集成的形式中：<br />//用这种方法来取得数字<br /><pre class="overflow">int[] numbers = getListOfNumbers( );</pre><br /><br />要把这些数字传递给max()方法是不可能的。你需要检查list的长度，从中截取掉第一个对象（如果存在第一个对象的话），然后检查类型来确保是int型。完成了这些，你才可以带着数组中剩余的部分一起传递进入方法。而这数组中剩余的部分还要重复，或者要人工地转化为适合的格式。总之，这个过程会很辛苦，你需要做许多琐碎的事情。仔细想想，你要记得编译器是将这个方法解释为下面的语句：<br />public static int max(int first, int[] rest)<br />所以，你可以做些调整，把max()方法改写成下面这个样子：<br /><pre class="overflow">public static int max(int... values) {<br />int max = Integer.MIN_VALUE;<br />for (int i : values) {<br />if (i &gt; max)<br />max = i;<br />}<br />return</pre><br /><br />你现在已经定义了一个可以很容易接受数组的方法。<br /><pre class="overflow">//用这种方法来取得数字<br />int[] numbers = getListOfNumbers( );<br />int max = MathUtils.max(numbers);</pre><br /><br />当接受单一的可变长度参数时，你使用这种方法会很简单。但是，如果在最好的情况下，你传递了一个零长度的数组进去，这就会带来问题，你会得到难以预料的结果。为了解决这个问题，你需要一个小的错误检查。例5-3是MathUtils类的完整代码列表，在这里是一个功能更强的MathUtil类。<br /><br /><br />例5-3 处理零参数的方法<br /><pre class="overflow">package com.oreilly.tiger.ch05;<br />public class MathUtils {<br />public static int max(int... values) {<br />if (values.length == 0) {<br />throw new IllegalArgumentException("No values supplied.");<br />}</pre><br /><br />任何时候，你都可能会要处理零长度的参数列表，这时你就需要执行这类的错误检查。通常，一个功能强大的IllegalArgumentException类是一个好的选择。<br /><pre class="overflow">int max = Integer.MIN_VALUE;<br />for (int i : values) {<br />if (i &gt; max)<br />max = i;<br />}<br />return max;<br />}<br />}</pre><br /><br /><br />那么关于调用同样的方法来处理通常参数不是数组的方法，又会如何呢?这当然是完全合法的。下面的代码都是合法调用max()方法的手段：<br /><pre class="overflow">int max = MathUtils.max(myArray);<br />int max = MathUtils.max(new int[] { 2, 4, 6, 8 });<br />int max = MathUtils.max(2, 4, 6, 8);<br />int max = MathUtils.max(0);<br />int max = MathUtils.max( );</pre><br /><br /><b><span style="FONT-SIZE: 16px">指定对象参数，而非基本类型</span></b><br /><br />在第四章中我们谈到，Tiger通过拆箱增加了一系列的新特征。你可以在处理可变参数时，在你的方法接受的参数中使用对象包装类。<br /><br /><b>如何实现？</b><br />你一定记得在Java中所有的类最终都是java.lang.Object的子类。这就意味着任何对象可以被转化成一个Object对象。更进一步说，因为像int和short这样的基本类型会自动转化成他们对应的对象包装类（就像Integer和Short）,任何Java类型可以被转化成一个Object对象。<br />所以，如果你需要你的可变参数方法可以接受最多种参数的类型，那么你可以将Object类型作为参数的类型。更好的是，为了达到多重功能，绝大多数情况下都会使用Object对象。例如，写个用来打印方法。<br /><br /><pre class="overflow">private String print(Object... values) {<br />StringBuilder sb = new StringBuilder( );<br />for (Object o : values) {<br />sb.append(o)<br />.append(" ");<br />}<br />return sb.toString( );<br />}</pre><br /><br />这儿最简单的意思是打印出所有的东西。然而，这个方法更通用的定义是下面的样子：<br /><pre class="overflow">private String print(String... values) {<br />StringBuilder sb = new StringBuilder( );<br />for (Object o : values) {<br />sb.append(o)<br />.append(" ");<br />}<br />return sb.toString( );<br />}</pre><br /><br />这个方法的问题是方法自身不能接受字符串,整数,浮点数,数组和其他的类型数据，而这些数据你都想要正常的打印出来。通过使用Object这个更为通用的类型，你可以来打印所有的一切。<br /><pre class="overflow">private String print(Object... values) {<br />StringBuilder sb = new StringBuilder( );<br />for (Object o : values) {<br />sb.append(o)<br />.append(" ");<br />}<br />return sb.toString( );<br />}</pre><br /><br /><b><span style="FONT-SIZE: 16px">避免数组自动转化</span></b><br /><br />Tiger增加了各种类型的自动转化和便利，这些东西在绝大多数的情况下是很好用的。不幸的是，有些时候所有的这些东西会变成你的障碍。其中一种情况是，在可变参数方法中将多个Object对象转化为Object[]数组对象，你会发现在个别的情况下，你需要用Java来书写。<br /><br /><br /><b>如何实现？</b><br />在将要仔细讨论这件事情前，你要确信自己理解这个问题。Java新的printf()方法是一个很好的便利，举这个方法作个例子：<br /><pre class="overflow">System.out.printf("The balance of %s's account is $%(,6.2f\n",account.getOwner().getFullName( ),account.getBalance( ));</pre><br /><br /><br /><br />如果你看一下Java文档中关于printf()方法的说明，你就会看到它是一个可变参数的方法。它有两个参数：一个是用于设置字符串格式的String类型变量，另一个是所有要传递进字符串的Object对象:<br /><pre class="overflow">PrintStream printf(String format, Object... args)</pre><br /><br />现在，你可以把上面的代码默认为下面的形式：<br /><pre class="overflow">PrintStream printf(String format, Object[] args)</pre><br /><br />两种书写是不是完全相同呢？大多数情况下是相同的。考虑一下下面的代码：<br /><pre class="overflow">Object[] objectArray = getObjectArrayFromSomewhereElse( );<br />out.printf("Description of object array: %s\n", obj);</pre><br /><br />这是乎有点牵强，然而要把它看作是为了自省的代码而付出的正常开销。比起其它代码，这样写要简洁的多。如果你正在编写一个代码分析工具，或者一个集成开发环境，或者其他可能使用reflection或简单API来判断出应用程序会需要何种对象的东西，这些马上会成为一个通用的案例。这儿，你不是真正关心对象数组的内容，就像你同样不会去关心数组自身一样。它是什么类型？它的内存地址是多少？它的字符串代表什么意思？请紧记所有这些问题都是和数组本身有关的，和数组的内容无关。例如：我们来看看下面的数组代码：<br /><pre class="overflow">public Object[] getObjectArrayFromSomewhereElse( ) {<br />return new String[] {"Hello", "to", "all", "of", "you"};<br />}</pre><br /><br /><br />在这种情况下，你肯能会写一些像下面一样的代码来回答某些关于数组的问题：<br /><pre class="overflow">out.printf("Description of object array: %s\n", obj);</pre><br /><br />然而，输出结果并不是你所期望的那样：<br /><pre class="overflow">run-ch05:<br />[echo] Running Chapter 5 examples from Java Tiger: A Developer's Notebook<br />[echo] Running VarargsTester...<br />[java] Hello</pre><br /><br />这倒是怎么回事？这就不是你想看到的结果。然而，编译器做了它应该做的，它把在printf()方法里的Object...转换为Object[]。实际上，当编译器得到你方法的调用时，它看到的参数是Object[]。所以编译器不是把这个数组看作一个Object对象本身，而是把它分成不同的部分。这样被传递给字符串格式 (%s)的就是第一个参数部分“Hello”字符串，所以结果“Hello”就显示出来了。<br /><br />仔细看看这件事，你需要去告诉编译器你要把整个对象数组obj看作是一个简单的对象，而不是一组参数。请看下面奇特的代码：<br /><pre class="overflow">out.printf("Description of object array: %s\n", new Object[] { obj });</pre><br /><br />作为选择，还有一种更为简单的方法：<br /><pre class="overflow">out.printf("Description of object array: %s\n", (Object)obj);</pre><br /><br /><br />在上面两种书写情况下，编译器不再认为是对象的数组，而是直接认为是一个简单的Object对象，而这个Object对象又恰好是一个对象数组。那么结果就如你所愿（至少在这种简单的应用下）：<br /><pre class="overflow">run-ch05:<br />[echo] Running Chapter 5 examples from Java Tiger: A Developer's Notebook<br />[echo] Running VarargsTester...<br />[java] [Ljava.lang.String;@c44b88</pre><br /><br />看到结果，你肯能会感到有点错乱。这大概是基于reflection或者其他自省代码需要的结果。<br /><br />全章完.<br /><img src ="http://www.blogjava.net/tangzurui/aggbug/217518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tangzurui/" target="_blank">梓枫</a> 2008-07-25 16:57 <a href="http://www.blogjava.net/tangzurui/archive/2008/07/25/217518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2SE5中的最新注释功能SuppressWarnings </title><link>http://www.blogjava.net/tangzurui/archive/2008/07/22/216555.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Tue, 22 Jul 2008 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/tangzurui/archive/2008/07/22/216555.html</guid><wfw:comment>http://www.blogjava.net/tangzurui/comments/216555.html</wfw:comment><comments>http://www.blogjava.net/tangzurui/archive/2008/07/22/216555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tangzurui/comments/commentRss/216555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tangzurui/services/trackbacks/216555.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、什么是注释																				    说起注释，得先提一提什么是元数据(metadata)。所谓元数据就是数据的数据。也就是说，元数据是描述数据的。就象数据表中的字段一样，每个字段描述了这个字段下的数据的含义。而J2SE5.0中提供的注释就是java源代码的元数据，也就是说注释是描述java源代码的。在J2SE5.0中可以自定义注释。使用时在@后面跟注释的名字。  ...&nbsp;&nbsp;<a href='http://www.blogjava.net/tangzurui/archive/2008/07/22/216555.html'>阅读全文</a><img src ="http://www.blogjava.net/tangzurui/aggbug/216555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tangzurui/" target="_blank">梓枫</a> 2008-07-22 11:36 <a href="http://www.blogjava.net/tangzurui/archive/2008/07/22/216555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>体验Java 5.0的新增语言特性</title><link>http://www.blogjava.net/tangzurui/archive/2008/07/21/216477.html</link><dc:creator>梓枫</dc:creator><author>梓枫</author><pubDate>Mon, 21 Jul 2008 15:01:00 GMT</pubDate><guid>http://www.blogjava.net/tangzurui/archive/2008/07/21/216477.html</guid><wfw:comment>http://www.blogjava.net/tangzurui/comments/216477.html</wfw:comment><comments>http://www.blogjava.net/tangzurui/archive/2008/07/21/216477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tangzurui/comments/commentRss/216477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tangzurui/services/trackbacks/216477.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:         增强的for循环<br>　　 为了迭代集合和数组，增强的for循环提供了一个简单、兼容的语法。有两点值得一提： 　　Init表达式<br><br>　　在循环中，初始化表达式只计算一次。这意味着您通常可以移除一个变量声明。在这个例子中，我们必须创建一个整型数组来保存computeNumbers()的结果，以防止每一次循环都重新计算该方法。您可以看到，下面的代码要比上面的代码整洁一些，并且没有泄露变量numbers： <br><br>　　未增强的For：　　int sum = 0;　　Integer[] numbers = computeNumbers();　　for (int i=0; i < numbers.length ; i++)    sum += numbers[i];　　　增强后的For： 　　　int sum = 0;　　for ( int number: computeNumbers() )    sum += number;......<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/tangzurui/archive/2008/07/21/216477.html'>阅读全文</a><img src ="http://www.blogjava.net/tangzurui/aggbug/216477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tangzurui/" target="_blank">梓枫</a> 2008-07-21 23:01 <a href="http://www.blogjava.net/tangzurui/archive/2008/07/21/216477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>