﻿<?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/forgood/category/32176.html</link><description>从这里出发</description><language>zh-cn</language><lastBuildDate>Sun, 18 Oct 2009 21:53:55 GMT</lastBuildDate><pubDate>Sun, 18 Oct 2009 21:53:55 GMT</pubDate><ttl>60</ttl><item><title>Queue</title><link>http://www.blogjava.net/forgood/archive/2009/10/18/298761.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Sun, 18 Oct 2009 10:29:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2009/10/18/298761.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/298761.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2009/10/18/298761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/298761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/298761.html</trackback:ping><description><![CDATA[public class QuenDemo {<br />
&nbsp;&nbsp;public static void main(String[] args){<br />
&nbsp;&nbsp;&nbsp;//public class Queue extends Collection<br />
&nbsp;&nbsp;&nbsp;Queue&lt;Integer&gt; queue=new LinkedList&lt;Integer&gt;();<br />
&nbsp;&nbsp;&nbsp;Random&nbsp; rand = new Random(47); <br />
&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;10;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;queue.offer(rand.nextInt(i+10));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.out.println("1111"+queue.toString());<br />
&nbsp;&nbsp;&nbsp;printQ(queue);<br />
&nbsp;&nbsp;&nbsp;//public class LinkedList extends AbstractSequentialList implements List,Queue,Cloneable,Serializable<br />
&nbsp;&nbsp;&nbsp;Queue&lt;Character&gt; qc=new LinkedList&lt;Character&gt;();<br />
&nbsp;&nbsp;&nbsp;for(char c:"guoxzh".toCharArray()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;qc.offer(c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("qc=="+qc.toString());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printQ(qc);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;public static void printQ(Queue queue){<br />
&nbsp;&nbsp;&nbsp;while(queue.peek()!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;//peek和element都是在不移除的情况下返回对头，但是peek在队列为空的情况下返回null，element方法会抛出NoSuchElementException异常<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(queue.remove());<br />
&nbsp;&nbsp;&nbsp;&nbsp;//remove和poll方法都是在移除并返回对头，但是poll在为空时返回null，而remove会抛出NoSucheElementException异常<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("2222"+queue.toString());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}<img src ="http://www.blogjava.net/forgood/aggbug/298761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2009-10-18 18:29 <a href="http://www.blogjava.net/forgood/archive/2009/10/18/298761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>byte数组和String之间的转化</title><link>http://www.blogjava.net/forgood/archive/2009/09/23/296155.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Wed, 23 Sep 2009 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2009/09/23/296155.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/296155.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2009/09/23/296155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/296155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/296155.html</trackback:ping><description><![CDATA[<p>JAVA里面关于byte数组和String之间的转换问题</p>
<p><span style="color: red">把byte转化成string，必须经过编码</span>。</p>
<p>例如下面一个例子:</p>
<p>import java.io.UnsupportedEncodingException;</p>
<p>public class test{<br />
&nbsp;public static void main(String g[]) {<br />
&nbsp; String s = "12345abcd";<br />
&nbsp; byte b[] = s.getBytes();<br />
&nbsp; String t = b.toString();</p>
<p>&nbsp; System.out.println(t);</p>
<p>&nbsp;}<br />
}<br />
输出字符串的结果和字符串s不一样了.</p>
<p>经过以下方式转码就可以正确转换了:</p>
<p>public class test{<br />
&nbsp;public static void main(String g[]) {<br />
&nbsp; String s = "12345abcd";<br />
&nbsp; byte b[] = s.getBytes();<br />
&nbsp; try {<br />
&nbsp;&nbsp; String t = new String(b);<br />
&nbsp;&nbsp; System.out.print(t);<br />
&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp; }<br />
&nbsp;}<br />
}</p>
<p>引用：<br />
String&nbsp;&nbsp; str&nbsp;&nbsp; =&nbsp;&nbsp; "String";&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[]&nbsp;&nbsp; byte1&nbsp;&nbsp; =&nbsp;&nbsp; str.getBytes();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; str1&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; String(byte1);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[]&nbsp;&nbsp; byte2&nbsp;&nbsp; =&nbsp;&nbsp; str1.getBytes();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; str2&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; String(byte2);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("str&lt;&lt;&lt;"&nbsp;&nbsp; +&nbsp;&nbsp; str);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("byte1&lt;&lt;&lt;"&nbsp;&nbsp; +&nbsp;&nbsp; byte1);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("str1&lt;&lt;&lt;"&nbsp;&nbsp; +&nbsp;&nbsp; str1);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("byte2&lt;&lt;&lt;"&nbsp;&nbsp; +&nbsp;&nbsp; byte2);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("str2&lt;&lt;&lt;"&nbsp;&nbsp; +&nbsp;&nbsp; str2);&nbsp; <br />
&nbsp; -------------------------------------&nbsp; <br />
&nbsp; 输出结果&nbsp; <br />
&nbsp; str&lt;&lt;&lt;String&nbsp; <br />
&nbsp; byte1&lt;&lt;&lt;[B@192d342&nbsp; <br />
&nbsp; str1&lt;&lt;&lt;String&nbsp; <br />
&nbsp; byte2&lt;&lt;&lt;[B@6b97fd&nbsp; <br />
&nbsp; str2&lt;&lt;&lt;String&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp; 想请教为什么两个byte输出的不一样呢?&nbsp; <br />
&nbsp;</p>
<p>String&nbsp;&nbsp; str&nbsp;&nbsp; =&nbsp;&nbsp; "String";&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[]&nbsp;&nbsp; byte1&nbsp;&nbsp; =&nbsp;&nbsp; str.getBytes();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; str1&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; String(byte1);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[]&nbsp;&nbsp; byte2&nbsp;&nbsp; =&nbsp;&nbsp; str1.getBytes();&nbsp; <br />
&nbsp; ----------&nbsp; <br />
&nbsp; 注意byte1是str得到的byte数组，而byte2是另一个字符串str1得到的数组&nbsp; <br />
&nbsp; 他们本身也是两个对象&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp; <span style="color: red">直接打印实际上调用的是toString()方法，而toString()的默认实现是打印对象类型+hashCode()&nbsp;&nbsp;<br />
</span>&nbsp; [B表示byte数组&nbsp;&nbsp;@表示之后的是地址&nbsp;&nbsp;后面跟着的是hashCode，其实就是其虚拟机地址&nbsp;&nbsp;<br />
&nbsp;&nbsp; <br />
</p>
<img src ="http://www.blogjava.net/forgood/aggbug/296155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2009-09-23 14:19 <a href="http://www.blogjava.net/forgood/archive/2009/09/23/296155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jvm的内存模型</title><link>http://www.blogjava.net/forgood/archive/2009/09/18/jvm.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Fri, 18 Sep 2009 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2009/09/18/jvm.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/295528.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2009/09/18/jvm.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/295528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/295528.html</trackback:ping><description><![CDATA[<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left">
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<span style="font-weight: bold; font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">从大的方面来讲，<font face="Arial">JVM</font><font face="宋体">的内存模型分为两大块：</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">永久区内存（&nbsp;</span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Permanent&nbsp;space</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">）和堆内存（<font face="Arial">heap&nbsp;space</font><font face="宋体">）。</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">栈内存（<font face="Arial">stack&nbsp;space</font><font face="宋体">）一般都不归在</font><font face="Arial">JVM</font><font face="宋体">内存模型中，因为栈内存属于线程级别。</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">每个线程都有个独立的栈内存空间。</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Permanent&nbsp;space<font face="宋体">里存放加载的</font><font face="Arial">Class</font><font face="宋体">类级对象如</font><font face="Arial">class</font><font face="宋体">本身，</font><font face="Arial">method</font><font face="宋体">，</font><font face="Arial">field</font><font face="宋体">等等。</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">heap&nbsp;space<font face="宋体">主要存放对象实例和数组。</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">heap&nbsp;space<font face="宋体">由</font><font face="Arial">Old&nbsp;</font></span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Generation<font face="宋体">和</font><font face="Arial">NewGeneration</font><font face="宋体">组成，</font><font face="Arial">OldGeneration</font><font face="宋体">存放生命周期长久的实例对象，而新的对象实例一般放在</font><font face="Arial">NewGeneration</font><font face="宋体">。</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">New&nbsp;</span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Generation<font face="宋体">还可以再分为</font><font face="Arial">Eden</font><font face="宋体">区</font><font face="Arial">(</font><font face="宋体">圣经中的伊甸园</font><font face="Arial">)</font><font face="宋体">、和</font><font face="Arial">Survivor</font><font face="宋体">区，新的对象实例总是首先放在</font><font face="Arial">Eden</font><font face="宋体">区，</font><font face="Arial">Survivor</font><font face="宋体">区作为</font><font face="Arial">Eden</font><font face="宋体">区和</font><font face="Arial">Old</font><font face="宋体">区的缓冲，可以向</font><font face="Arial">Old</font><font face="宋体">区转移活动的对象实例。</font></span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><br />
</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><br />
</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">一般，我们常见的<font face="Arial">OOM</font><font face="宋体">（</font><font face="Arial">out&nbsp;of&nbsp;memory</font><font face="宋体">）内存溢出异常，就是堆内存空间不足以存放新对象实例时导致。</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">永久区内存溢出相对少见，一般是由于需要加载海量的<font face="Arial">Class</font><font face="宋体">数据，超过了非堆内存的容量导致。通常出现在</font><font face="Arial">Web</font><font face="宋体">应用刚刚启动时，因此</font><font face="Arial">Web</font><font face="宋体">应用推荐使用预加载机制，方便在部署时就发现并解决该问题。</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">栈内存也会溢出，但是更加少见。</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-weight: bold; font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">堆内存优化：</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">调整<font face="Arial">JVM</font><font face="宋体">启动参数</font><font face="Arial">-Xms&nbsp;&nbsp;-Xmx&nbsp;&nbsp;&nbsp;-XX:newSize&nbsp;-XX:MaxNewSize</font><font face="宋体">，如调整初始堆内存和最大对内存&nbsp;</font><font face="Arial">-Xms256M&nbsp;-Xmx512M</font><font face="宋体">。&nbsp;或者调整初始</font><font face="Arial">New&nbsp;</font></span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Generation<font face="宋体">的初始内存和最大内存</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">-XX:newSize=128M&nbsp;-XX:MaxNewSize=128M<font face="宋体">。</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-weight: bold; font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">永久区内存优化：</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">调整<font face="Arial">PermSize</font><font face="宋体">参数&nbsp;&nbsp;&nbsp;如&nbsp;&nbsp;</font><font face="Arial">-XX:PermSize=256</font></span><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">M</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">-XX:MaxPermSize=512M</span><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">。</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-weight: bold; font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">栈内存优化：</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">调整每个线程的栈内存容量&nbsp;&nbsp;如&nbsp;&nbsp;<font face="Arial">-Xss2048K</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">最终，一个运行中的<font face="Arial">JVM</font><font face="宋体">所占的内存</font><font face="Arial">=&nbsp;</font><font face="宋体">堆内存&nbsp;&nbsp;</font><font face="Arial">+&nbsp;&nbsp;</font><font face="宋体">永久区内存&nbsp;&nbsp;</font><font face="Arial">+&nbsp;&nbsp;</font><font face="宋体">所有线程所占的栈内存总和</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">&nbsp;</span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">。</span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><br />
</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
</div>
<!--endfragment-->
<img src ="http://www.blogjava.net/forgood/aggbug/295528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2009-09-18 09:12 <a href="http://www.blogjava.net/forgood/archive/2009/09/18/jvm.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>漂亮代码七法</title><link>http://www.blogjava.net/forgood/archive/2009/01/18/251778.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Sun, 18 Jan 2009 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2009/01/18/251778.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/251778.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2009/01/18/251778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/251778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/251778.html</trackback:ping><description><![CDATA[写出漂亮代码的七种方法 <br />
<br />
首先我想说明我本文阐述的是纯粹从美学的角度来写出代码，而非技术、逻辑等。以下为写出漂亮代码的七种方法： <br />
<br />
<br />
<br />
1， 尽快结束 if语句 <br />
<br />
<br />
<br />
例如下面这个JavaScript语句，看起来就很恐怖： <br />
<br />
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunfengcheng.javaeye.com/blog/311481#"><img alt="复制代码" src="http://sunfengcheng.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="number">1</span><span>&nbsp;function&nbsp;findShape(flags,&nbsp;point,&nbsp;attribute,&nbsp;list)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">2</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!findShapePoints(flags,&nbsp;point,&nbsp;attribute))&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">3</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!doFindShapePoints(flags,&nbsp;point,&nbsp;attribute))&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">4</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!findInShape(flags,&nbsp;point,&nbsp;attribute))&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">5</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!findFromGuide(flags,point)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">6</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(list.count()&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>&nbsp;&amp;&amp;&nbsp;flags&nbsp;==&nbsp;</span><span class="number">1</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">7</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doSomething(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">8</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">9</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">10</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">11</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">12</span><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">13</span><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">1 function findShape(flags, point, attribute, list) {
2    if(!findShapePoints(flags, point, attribute)) {
3        if(!doFindShapePoints(flags, point, attribute)) {
4            if(!findInShape(flags, point, attribute)) {
5                if(!findFromGuide(flags,point) {
6                    if(list.count() &gt; 0 &amp;&amp; flags == 1) {
7                          doSomething();
8                    }
9                }
10            }
11       }
12    }
13  }</pre>
<br />
<br />
但如果这么写就好看得多： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunfengcheng.javaeye.com/blog/311481#"><img alt="复制代码" src="http://sunfengcheng.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="number">1</span><span>&nbsp;function&nbsp;findShape(flags,&nbsp;point,&nbsp;attribute,&nbsp;list)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">2</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(findShapePoints(flags,&nbsp;point,&nbsp;attribute))&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">3</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">4</span><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">5</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">6</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(doFindShapePoints(flags,&nbsp;point,&nbsp;attribute))&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">7</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">8</span><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">9</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">10</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(findInShape(flags,&nbsp;point,&nbsp;attribute))&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">11</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">12</span><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">13</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">14</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(findFromGuide(flags,point)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">15</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">16</span><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">17</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">18</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!(list.count()&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>&nbsp;&amp;&amp;&nbsp;flags&nbsp;==&nbsp;</span><span class="number">1</span><span>))&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">19</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">20</span><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">21</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">22</span><span>&nbsp;&nbsp;&nbsp;&nbsp;doSomething(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">23</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">24</span><span>&nbsp;}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">1 function findShape(flags, point, attribute, list) {
2    if(findShapePoints(flags, point, attribute)) {
3        return;
4    }
5
6    if(doFindShapePoints(flags, point, attribute)) {
7        return;
8    }
9
10    if(findInShape(flags, point, attribute)) {
11        return;
12    }
13
14    if(findFromGuide(flags,point) {
15        return;
16    }
17
18    if (!(list.count() &gt; 0 &amp;&amp; flags == 1)) {
19        return;
20    }
21
22    doSomething();
23
24 }</pre>
<br />
<br />
<br />
你可能会很不喜欢第二种的表述方式，但反映出了迅速返回if值的思想，也可以理解为：避免不必要的else陈述。 <br />
<br />
<br />
<br />
2， 如果只是简单的布尔运算（逻辑运算），不要使用if语句 <br />
<br />
<br />
<br />
例如： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunfengcheng.javaeye.com/blog/311481#"><img alt="复制代码" src="http://sunfengcheng.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="number">1</span><span>&nbsp;function&nbsp;isStringEmpty(str){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">2</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(str&nbsp;===&nbsp;</span><span class="string">""</span><span>)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">3</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">4</span><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">5</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">6</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">7</span><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">8</span><span>&nbsp;}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">1 function isStringEmpty(str){
2    if(str === "") {
3        return true;
4    }
5    else {
6        return false;
7    }
8 }</pre>
<br />
<br />
可以写为： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunfengcheng.javaeye.com/blog/311481#"><img alt="复制代码" src="http://sunfengcheng.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="number">1</span><span>&nbsp;function&nbsp;isStringEmpty(str){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">2</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(str&nbsp;===&nbsp;</span><span class="string">""</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">3</span><span>&nbsp;}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">1 function isStringEmpty(str){
2    return (str === "");
3 }</pre>
<br />
3， 使用空白，这是免费的 <br />
<br />
例如： <br />
<br />
1
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunfengcheng.javaeye.com/blog/311481#"><img alt="复制代码" src="http://sunfengcheng.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&nbsp;function&nbsp;getSomeAngle()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">2</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Some&nbsp;code&nbsp;here&nbsp;then </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">3</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radAngle1&nbsp;=&nbsp;Math.atan(slope(center,&nbsp;point1)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">4</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radAngle2&nbsp;=&nbsp;Math.atan(slope(center,&nbsp;point2)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">5</span><span>&nbsp;&nbsp;&nbsp;&nbsp;firstAngle&nbsp;=&nbsp;getStartAngle(radAngle1,&nbsp;point1,&nbsp;center); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">6</span><span>&nbsp;&nbsp;&nbsp;&nbsp;secondAngle&nbsp;=&nbsp;getStartAngle(radAngle2,&nbsp;point2,&nbsp;center); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">7</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radAngle1&nbsp;=&nbsp;degreesToRadians(firstAngle); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">8</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radAngle2&nbsp;=&nbsp;degreesToRadians(secondAngle); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">9</span><span>&nbsp;&nbsp;&nbsp;&nbsp;baseRadius&nbsp;=&nbsp;distance(point,&nbsp;center); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">10</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radius&nbsp;=&nbsp;baseRadius&nbsp;+&nbsp;(lines&nbsp;*&nbsp;y); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">11</span><span>&nbsp;&nbsp;&nbsp;&nbsp;p1[</span><span class="string">"x"</span><span>]&nbsp;=&nbsp;roundValue(radius&nbsp;*&nbsp;Math.cos(radAngle1)&nbsp;+&nbsp;center[</span><span class="string">"x"</span><span>]); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">12</span><span>&nbsp;&nbsp;&nbsp;&nbsp;p1[</span><span class="string">"y"</span><span>]&nbsp;=&nbsp;roundValue(radius&nbsp;*&nbsp;Math.sin(radAngle1)&nbsp;+&nbsp;center[</span><span class="string">"y"</span><span>]); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">13</span><span>&nbsp;&nbsp;&nbsp;&nbsp;pt2[</span><span class="string">"x"</span><span>]&nbsp;=&nbsp;roundValue(radius&nbsp;*&nbsp;Math.cos(radAngle2)&nbsp;+&nbsp;center[</span><span class="string">"y"</span><span>]); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">14</span><span>&nbsp;&nbsp;&nbsp;&nbsp;pt2[</span><span class="string">"y"</span><span>]&nbsp;=&nbsp;roundValue(radius&nbsp;*&nbsp;Math.sin(radAngle2)&nbsp;+&nbsp;center[</span><span class="string">"y"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">15</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Now&nbsp;some&nbsp;more&nbsp;code </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">16</span><span>&nbsp;}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code"> function getSomeAngle() {
2    // Some code here then
3    radAngle1 = Math.atan(slope(center, point1));
4    radAngle2 = Math.atan(slope(center, point2));
5    firstAngle = getStartAngle(radAngle1, point1, center);
6    secondAngle = getStartAngle(radAngle2, point2, center);
7    radAngle1 = degreesToRadians(firstAngle);
8    radAngle2 = degreesToRadians(secondAngle);
9    baseRadius = distance(point, center);
10    radius = baseRadius + (lines * y);
11    p1["x"] = roundValue(radius * Math.cos(radAngle1) + center["x"]);
12    p1["y"] = roundValue(radius * Math.sin(radAngle1) + center["y"]);
13    pt2["x"] = roundValue(radius * Math.cos(radAngle2) + center["y"]);
14    pt2["y"] = roundValue(radius * Math.sin(radAngle2) + center["y");
15    // Now some more code
16 }</pre>
<br />
<br />
很多开发者不愿意使用空白，就好像这要收费一样。我在此并非刻意地添加空白，粗鲁地打断代码的连贯性。在实际编写代码的过程中，会很容易地发现在什么地方加入空白，这不但美观而且让读者易懂，如下： <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunfengcheng.javaeye.com/blog/311481#"><img alt="复制代码" src="http://sunfengcheng.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="number">1</span><span>&nbsp;function&nbsp;getSomeAngle()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">2</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Some&nbsp;code&nbsp;here&nbsp;then </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">3</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radAngle1&nbsp;=&nbsp;Math.atan(slope(center,&nbsp;point1)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">4</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radAngle2&nbsp;=&nbsp;Math.atan(slope(center,&nbsp;point2)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">5</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">6</span><span>&nbsp;&nbsp;&nbsp;&nbsp;firstAngle&nbsp;=&nbsp;getStartAngle(radAngle1,&nbsp;point1,&nbsp;center); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">7</span><span>&nbsp;&nbsp;&nbsp;&nbsp;secondAngle&nbsp;=&nbsp;getStartAngle(radAngle2,&nbsp;point2,&nbsp;center); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">8</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">9</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radAngle1&nbsp;=&nbsp;degreesToRadians(firstAngle); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">10</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radAngle2&nbsp;=&nbsp;degreesToRadians(secondAngle); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">11</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">12</span><span>&nbsp;&nbsp;&nbsp;&nbsp;baseRadius&nbsp;=&nbsp;distance(point,&nbsp;center); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">13</span><span>&nbsp;&nbsp;&nbsp;&nbsp;radius&nbsp;=&nbsp;baseRadius&nbsp;+&nbsp;(lines&nbsp;*&nbsp;y); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">14</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">15</span><span>&nbsp;&nbsp;&nbsp;&nbsp;p1[</span><span class="string">"x"</span><span>]&nbsp;=&nbsp;roundValue(radius&nbsp;*&nbsp;Math.cos(radAngle1)&nbsp;+&nbsp;center[</span><span class="string">"x"</span><span>]); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">16</span><span>&nbsp;&nbsp;&nbsp;&nbsp;p1[</span><span class="string">"y"</span><span>]&nbsp;=&nbsp;roundValue(radius&nbsp;*&nbsp;Math.sin(radAngle1)&nbsp;+&nbsp;center[</span><span class="string">"y"</span><span>]); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">17</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">18</span><span>&nbsp;&nbsp;&nbsp;&nbsp;pt2[</span><span class="string">"x"</span><span>]&nbsp;=&nbsp;roundValue(radius&nbsp;*&nbsp;Math.cos(radAngle2)&nbsp;+&nbsp;center[</span><span class="string">"y"</span><span>]); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">19</span><span>&nbsp;&nbsp;&nbsp;&nbsp;pt2[</span><span class="string">"y"</span><span>]&nbsp;=&nbsp;roundValue(radius&nbsp;*&nbsp;Math.sin(radAngle2)&nbsp;+&nbsp;center[</span><span class="string">"y"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">20</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Now&nbsp;some&nbsp;more&nbsp;code </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">21</span><span>&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">4</span><span>，&nbsp;不要使用无谓的注释 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>无谓的注释让人费神，这实在很讨厌。不要标出很明显的注释。在以下的例子中，每个人都知道代码表达的是&#8220;students&nbsp;id&#8221;，因而没必要标出。 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">1</span><span>&nbsp;function&nbsp;existsStudent(id,&nbsp;list)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">2</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;list.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">3</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;student&nbsp;=&nbsp;list[i]; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">4</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">5</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Get&nbsp;the&nbsp;student's&nbsp;id </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">6</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thisId&nbsp;=&nbsp;student.getId(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">7</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">8</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(thisId&nbsp;===&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">9</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">10</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">11</span><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">12</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">13</span><span>&nbsp;}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">1 function getSomeAngle() {
2    // Some code here then
3    radAngle1 = Math.atan(slope(center, point1));
4    radAngle2 = Math.atan(slope(center, point2));
5
6    firstAngle = getStartAngle(radAngle1, point1, center);
7    secondAngle = getStartAngle(radAngle2, point2, center);
8
9    radAngle1 = degreesToRadians(firstAngle);
10    radAngle2 = degreesToRadians(secondAngle);
11
12    baseRadius = distance(point, center);
13    radius = baseRadius + (lines * y);
14
15    p1["x"] = roundValue(radius * Math.cos(radAngle1) + center["x"]);
16    p1["y"] = roundValue(radius * Math.sin(radAngle1) + center["y"]);
17
18    pt2["x"] = roundValue(radius * Math.cos(radAngle2) + center["y"]);
19    pt2["y"] = roundValue(radius * Math.sin(radAngle2) + center["y");
20    // Now some more code
21 }
4， 不要使用无谓的注释
无谓的注释让人费神，这实在很讨厌。不要标出很明显的注释。在以下的例子中，每个人都知道代码表达的是&#8220;students id&#8221;，因而没必要标出。
1 function existsStudent(id, list) {
2    for(i = 0; i &lt; list.length; i++) {
3       student = list[i];
4
5       // Get the student's id
6       thisId = student.getId();
7
8       if(thisId === id) {
9           return true;
10       }
11    }
12    return false;
13 }</pre>
<br />
<br />
<br />
5， 不要在源文件中留下已经删除的代码，哪怕你标注了 <br />
<br />
如果你使用了版本控制，那么你就可以轻松地找回前一个版本的代码。如果别人大费周折地读了你的代码,却发现是要删除的代码，这实在太恨人了。 <br />
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunfengcheng.javaeye.com/blog/311481#"><img alt="复制代码" src="http://sunfengcheng.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="comment">//function&nbsp;thisReallyHandyFunction()&nbsp;{ </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;someMagic(); </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;someMoreMagic(); </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;magicNumber&nbsp;=&nbsp;evenMoreMagic(); </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;magicNumber; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//}</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">//function thisReallyHandyFunction() {
//      someMagic();
//      someMoreMagic();
//      magicNumber = evenMoreMagic();
//      return magicNumber;
//}</pre>
<br />
<br />
6，不要有太长的代码 <br />
<br />
<br />
<br />
看太长的代码实在太费劲，尤其是代码本身的功能又很小。如下： <br />
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://sunfengcheng.javaeye.com/blog/311481#"><img alt="复制代码" src="http://sunfengcheng.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="number">1</span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;EnumMap&lt;Category,&nbsp;IntPair&gt;&nbsp;getGroupCategoryDistribution(EnumMap&lt;Category,&nbsp;Integer&gt;&nbsp;sizes,&nbsp;</span><span class="keyword">int</span><span>&nbsp;groups)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">2</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnumMap&lt;Category,&nbsp;IntPair&gt;&nbsp;categoryGroupCounts&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;EnumMap&lt;Category,IntPair&gt;(Category.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">3</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">4</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(Category&nbsp;cat&nbsp;:&nbsp;Category.values())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">5</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryGroupCounts.put(cat,&nbsp;getCategoryDistribution(sizes.get(cat),&nbsp;groups)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">6</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">1 public static EnumMap&lt;Category, IntPair&gt; getGroupCategoryDistribution(EnumMap&lt;Category, Integer&gt; sizes, int groups) {
2        EnumMap&lt;Category, IntPair&gt; categoryGroupCounts = new EnumMap&lt;Category,IntPair&gt;(Category.class);
3
4        for(Category cat : Category.values()) {
5            categoryGroupCounts.put(cat, getCategoryDistribution(sizes.get(cat), groups));
6        }</pre>
<br />
<br />
# <br />
<br />
<br />
<br />
我并不是说非要坚持70个字符以内，但是一个比较理想的长度是控制在120个字符内。如果你把代码发布在互联网上，用户读起来就很困难。 <br />
<br />
7，不要在一个功能（或者函数内）有太多代码行 <br />
<br />
我的一个老同事曾经说Visual C++很臭，因为它不允许你在一个函数内拥有超过10，000行代码。我记不清代码行数的上限，不知道他说的是否正确，但我很不赞成他的观点。如果一个函数超过了50行，看起来有多费劲你知道么，还有没完没了的if循环，而且你还的滚动鼠标前后对照这段代码。对我而言，超过35行的代码理解起来就很困难了。我的建议是超过这个数字就把一个函数代码分割成两个。
<img src ="http://www.blogjava.net/forgood/aggbug/251778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2009-01-18 14:33 <a href="http://www.blogjava.net/forgood/archive/2009/01/18/251778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>反射机制补充</title><link>http://www.blogjava.net/forgood/archive/2009/01/11/250870.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Sun, 11 Jan 2009 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2009/01/11/250870.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/250870.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2009/01/11/250870.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/250870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/250870.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">本篇文章为在工作中使用JAVA反射的经验总结，也可以说是一些小技巧，以后学会新的小技巧，会不断更新。
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在开始之前，我先定义一个测试类Student，代码如下：</p>
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword"><strong><font color="#006699">package</font></strong></span><span> chb.test.reflect; &nbsp;&nbsp;</span></span>
                <li><span>&nbsp;&nbsp;</span>
                <li class="alt"><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span> Student { &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">private</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">int</font></strong></span><span> age; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">private</font></strong></span><span> String name; &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">int</font></strong></span><span> getAge() { &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">return</font></strong></span><span> age; &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">void</font></strong></span><span> setAge(</span><span class="keyword"><strong><font color="#006699">int</font></strong></span><span> age) { &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">this</font></strong></span><span>.age = age; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> String getName() { &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">return</font></strong></span><span> name; &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">void</font></strong></span><span> setName(String name) { &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">this</font></strong></span><span>.name = name; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">static</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">void</font></strong></span><span> hi(</span><span class="keyword"><strong><font color="#006699">int</font></strong></span><span> age,String name){ &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"大家好，我叫"</font></span><span>+name+</span><span class="string"><font color="#0000ff">"，今年"</font></span><span>+age+</span><span class="string"><font color="#0000ff">"岁"</font></span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span>
                <li><span>}&lt;PRE&gt;&lt;/PRE&gt;&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <pre class="Java" style="display: none" name="code">package chb.test.reflect;
            public class Student {
            private int age;
            private String name;
            public int getAge() {
            return age;
            }
            public void setAge(int age) {
            this.age = age;
            }
            public String getName() {
            return name;
            }
            public void setName(String name) {
            this.name = name;
            }
            public static void hi(int age,String name){
            System.out.println("大家好，我叫"+name+"，今年"+age+"岁");
            }
            }
            <pre> </pre>
            </pre>
            <p><strong>一、JAVA反射的常规使用步骤</strong></p>
            <p dir="ltr" style="margin-right: 0px">&nbsp;&nbsp;&nbsp; 反射调用一般分为3个步骤：</p>
            <ul dir="ltr">
                <li>
                <div style="margin-right: 0px">得到要调用类的class</div>
                <li>
                <div style="margin-right: 0px">得到要调用的类中的方法(Method)</div>
                <li>
                <div style="margin-right: 0px">方法调用(invoke)</div>
                </li>
            </ul>
            <p dir="ltr" style="margin-right: 0px">&nbsp;&nbsp;&nbsp;&nbsp; 代码示例：</p>
            <div class="dp-highlighter">
            <ol class="dp-c">
                <li class="alt"><span><span>Class cls = Class.forName(</span><span class="string"><font color="#0000ff">"chb.test.reflect.Student"</font></span><span>); &nbsp;&nbsp;</span></span>
                <li><span>Method m = cls.getDeclaredMethod(</span><span class="string"><font color="#0000ff">"hi"</font></span><span>,</span><span class="keyword"><strong><font color="#006699">new</font></strong></span><span> Class[]{</span><span class="keyword"><strong><font color="#006699">int</font></strong></span><span>.</span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span>,String.</span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span>}); &nbsp;&nbsp;</span>
                <li class="alt"><span>m.invoke(cls.newInstance(),20,</span><span class="string"><font color="#0000ff">"chb"</font></span><span>);&lt;PRE&gt;&lt;/PRE&gt;&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <pre class="Csharp" style="display: none" name="code">Class cls = Class.forName("chb.test.reflect.Student");
            Method m = cls.getDeclaredMethod("hi",new Class[]{int.class,String.class});
            m.invoke(cls.newInstance(),20,"chb");
            <pre> </pre>
            </pre>
            <p><strong>二、方法调用中的参数类型</strong></p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在方法调用中，参数类型必须正确，这里需要注意的是不能使用包装类替换基本类型，比如不能使用Integer.class代替int.class。</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如我要调用Student的setAge方法，下面的调用是正确的：</p>
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span>Class cls = Class.forName(</span><span class="string"><font color="#0000ff">"chb.test.reflect.Student"</font></span><span>); &nbsp;&nbsp;</span></span>
                <li><span>Method setMethod = cls.getDeclaredMethod(</span><span class="string"><font color="#0000ff">"setAge"</font></span><span>,</span><span class="keyword"><strong><font color="#006699">int</font></strong></span><span>.</span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>setMethod.invoke(cls.newInstance(), </span><span class="number"><font color="#c00000">15</font></span><span>);&lt;PRE&gt;&lt;/PRE&gt;&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <pre class="Java" style="display: none" name="code">Class cls = Class.forName("chb.test.reflect.Student");
            Method setMethod = cls.getDeclaredMethod("setAge",int.class);
            setMethod.invoke(cls.newInstance(), 15);
            <pre> </pre>
            </pre>
            <p>&nbsp;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而如果我们用Integer.class替代int.class就会出错，如：</p>
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span>Class cls = Class.forName(</span><span class="string"><font color="#0000ff">"chb.test.reflect.Student"</font></span><span>); &nbsp;&nbsp;</span></span>
                <li><span>Method setMethod = cls.getDeclaredMethod(</span><span class="string"><font color="#0000ff">"setAge"</font></span><span>,Integer.</span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>setMethod.invoke(cls.newInstance(), </span><span class="number"><font color="#c00000">15</font></span><span>);&lt;PRE&gt;&lt;/PRE&gt;&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <pre class="Java" style="display: none" name="code">Class cls = Class.forName("chb.test.reflect.Student");
            Method setMethod = cls.getDeclaredMethod("setAge",Integer.class);
            setMethod.invoke(cls.newInstance(), 15);
            <pre> </pre>
            </pre>
            <p>&nbsp;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jvm会报出如下异常：</p>
            <div class="dp-highlighter">
            <ol class="dp-xml">
                <li class="alt"><span><span>java.lang.NoSuchMethodException: chb.test.reflect.Student.setAge(java.lang.Integer) &nbsp;&nbsp;</span></span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Class.getDeclaredMethod(Unknown Source) &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; at chb.test.reflect.TestClass.testReflect(TestClass.java:23)</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">PRE</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">PRE</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <pre class="HTML" style="display: none" name="code">java.lang.NoSuchMethodException: chb.test.reflect.Student.setAge(java.lang.Integer)
            at java.lang.Class.getDeclaredMethod(Unknown Source)
            at chb.test.reflect.TestClass.testReflect(TestClass.java:23)
            <pre> </pre>
            </pre>
            <p>&nbsp;</p>
            <p><strong>三、static方法的反射调用</strong></p>
            <p>&nbsp;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static方法调用时，不必得到对象示例，如下：</p>
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span>Class cls = Class.forName(</span><span class="string"><font color="#0000ff">"chb.test.reflect.Student"</font></span><span>); &nbsp;&nbsp;</span></span>
                <li><span>Method staticMethod = cls.getDeclaredMethod(</span><span class="string"><font color="#0000ff">"hi"</font></span><span>,</span><span class="keyword"><strong><font color="#006699">int</font></strong></span><span>.</span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span>,String.</span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>staticMethod.invoke(cls,</span><span class="number"><font color="#c00000">20</font></span><span>,</span><span class="string"><font color="#0000ff">"chb"</font></span><span>);</span><span class="comment"><font color="#008200">//这里不需要newInstance </font></span><span>&nbsp;&nbsp;</span>
                <li><span class="comment"><font color="#008200">//staticMethod.invoke(cls.newInstance(),20,"chb");&lt;PRE&gt;&lt;/PRE&gt;</font></span><span>&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <pre class="Java" style="display: none" name="code">Class cls = Class.forName("chb.test.reflect.Student");
            Method staticMethod = cls.getDeclaredMethod("hi",int.class,String.class);
            staticMethod.invoke(cls,20,"chb");//这里不需要newInstance
            //staticMethod.invoke(cls.newInstance(),20,"chb");
            <pre> </pre>
            </pre>
            <p><strong>四、private的成员变量赋值</strong></p>
            <p>&nbsp;&nbsp;&nbsp; 如果直接通过反射给类的private成员变量赋值，是不允许的，这时我们可以通过setAccessible方法解决。代码示例：</p>
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span>Class cls = Class.forName(</span><span class="string"><font color="#0000ff">"chb.test.reflect.Student"</font></span><span>); &nbsp;&nbsp;</span></span>
                <li><span>Object student = cls.newInstance();</span><span class="comment"><font color="#008200">//得到一个实例 </font></span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>Field field = cls.getDeclaredField(</span><span class="string"><font color="#0000ff">"age"</font></span><span>); &nbsp;&nbsp;</span>
                <li><span>field.set(student, </span><span class="number"><font color="#c00000">10</font></span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>System.out.println(field.get(student));&lt;PRE&gt;&lt;/PRE&gt;&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <pre class="Java" style="display: none" name="code">Class cls = Class.forName("chb.test.reflect.Student");
            Object student = cls.newInstance();//得到一个实例
            Field field = cls.getDeclaredField("age");
            field.set(student, 10);
            System.out.println(field.get(student));
            <pre> </pre>
            </pre>
            <p>&nbsp;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp; 运行如上代码，系统会报出如下异常：</p>
            <div class="dp-highlighter">
            <ol class="dp-xml">
                <li class="alt"><span><span>java.lang.IllegalAccessException: Class chb.test.reflect.TestClass can not access a member of class chb.test.reflect.Student with modifiers "private" &nbsp;&nbsp;</span></span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp; at sun.reflect.Reflection.ensureMemberAccess(Unknown Source) &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.reflect.Field.doSecurityCheck(Unknown Source) &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.reflect.Field.getFieldAccessor(Unknown Source) &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.reflect.Field.set(Unknown Source) &nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp; at chb.test.reflect.TestClass.testReflect(TestClass.java:20)</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">PRE</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">PRE</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <pre class="HTML" style="display: none" name="code">java.lang.IllegalAccessException: Class chb.test.reflect.TestClass can not access a member of class chb.test.reflect.Student with modifiers "private"
            at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
            at java.lang.reflect.Field.doSecurityCheck(Unknown Source)
            at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
            at java.lang.reflect.Field.set(Unknown Source)
            at chb.test.reflect.TestClass.testReflect(TestClass.java:20)
            <pre> </pre>
            </pre>
            <p>&nbsp;&nbsp;&nbsp; 解决方法：</p>
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span>Class cls = Class.forName(</span><span class="string"><font color="#0000ff">"chb.test.reflect.Student"</font></span><span>); &nbsp;&nbsp;</span></span>
                <li><span>Object student = cls.newInstance(); &nbsp;&nbsp;</span>
                <li class="alt"><span>Field field = cls.getDeclaredField(</span><span class="string"><font color="#0000ff">"age"</font></span><span>); &nbsp;&nbsp;</span>
                <li><span>field.setAccessible(</span><span class="keyword"><strong><font color="#006699">true</font></strong></span><span>);</span><span class="comment"><font color="#008200">//设置允许访问 </font></span><span>&nbsp;&nbsp;</span>
                <li class="alt"><span>field.set(student, </span><span class="number"><font color="#c00000">10</font></span><span>); &nbsp;&nbsp;</span>
                <li><span>System.out.println(field.get(student));&lt;PRE&gt;&lt;/PRE&gt;&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <pre class="Java" style="display: none" name="code">Class cls = Class.forName("chb.test.reflect.Student");
            Object student = cls.newInstance();
            Field field = cls.getDeclaredField("age");
            field.setAccessible(true);//设置允许访问
            field.set(student, 10);
            System.out.println(field.get(student));
            <pre> </pre>
            </pre>
            <p>&nbsp;&nbsp;&nbsp; 其实，在某些场合下(类中有get,set方法)，可以先反射调用set方法，再反射调用get方法达到如上效果，代码示例：</p>
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span>Class cls = Class.forName(</span><span class="string"><font color="#0000ff">"chb.test.reflect.Student"</font></span><span>); &nbsp;&nbsp;</span></span>
                <li><span>Object student = cls.newInstance(); &nbsp;&nbsp;</span>
                <li class="alt"><span>&nbsp;&nbsp;</span>
                <li><span>Method setMethod = cls.getDeclaredMethod(</span><span class="string"><font color="#0000ff">"setAge"</font></span><span>,Integer.</span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span>); &nbsp;&nbsp;</span>
                <li class="alt"><span>setMethod.invoke(student, </span><span class="number"><font color="#c00000">15</font></span><span>);</span><span class="comment"><font color="#008200">//调用set方法 </font></span><span>&nbsp;&nbsp;</span>
                <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
                <li class="alt"><span>Method getMethod = cls.getDeclaredMethod(</span><span class="string"><font color="#0000ff">"getAge"</font></span><span>); &nbsp;&nbsp;</span>
                <li><span>System.out.println(getMethod.invoke(student));</span><span class="comment"><font color="#008200">//再调用get方法&lt;PRE&gt;&lt;/PRE&gt;</font></span> </li>
            </ol>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/forgood/aggbug/250870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2009-01-11 17:28 <a href="http://www.blogjava.net/forgood/archive/2009/01/11/250870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的反射机制</title><link>http://www.blogjava.net/forgood/archive/2009/01/11/250869.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Sun, 11 Jan 2009 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2009/01/11/250869.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/250869.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2009/01/11/250869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/250869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/250869.html</trackback:ping><description><![CDATA[Reflection 是 Java 程序开发语言的特征之一，它允许运行中的 Java 程序对自身进行检查，或者说&#8220;自审&#8221;，并能直接操作程序的内部属性。例如，使用它能获得 Java 类中各成员的名称并显示出来。JavaBean 是 reflection 的实际应用之一，它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。<br />
&nbsp;&nbsp;&nbsp; 1. 一个简单的例子<br />
&nbsp;&nbsp;&nbsp; 考虑下面这个简单的例子，让我们看看 reflection 是如何工作的。<br />
&nbsp;&nbsp;&nbsp; import java.lang.reflect.*;<br />
&nbsp;&nbsp;&nbsp; public class DumpMethods {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class c = Class.forName(args[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m[] = c.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; m.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(m[i].toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 按如下语句执行：<br />
&nbsp;&nbsp;&nbsp; java DumpMethods java.util.Stack<br />
&nbsp;&nbsp;&nbsp; 它的结果输出为：<br />
&nbsp;&nbsp;&nbsp; public java.lang.Object java.util.Stack.push(java.lang.Object)<br />
&nbsp;&nbsp;&nbsp; public synchronized java.lang.Object java.util.Stack.pop()<br />
&nbsp;&nbsp;&nbsp; public synchronized java.lang.Object java.util.Stack.peek()<br />
&nbsp;&nbsp;&nbsp; public boolean java.util.Stack.empty()<br />
&nbsp;&nbsp;&nbsp; public synchronized int java.util.Stack.search(java.lang.Object)<br />
&nbsp;&nbsp;&nbsp; 这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。<br />
&nbsp;&nbsp;&nbsp; 这个程序使用 Class.forName 载入指定的类，然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。还有就是getDeclaredMethod(para1,para2)来获取这个类中的具体某一个方法，其中para1是一个String类型，具体代表的是方法名，para2是个一个Class类型的数组，其中定义个方法的具体参数类型。<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如：
<ol class="dp-c">
    <li class="alt"><span><span>Class cls = Class.forName(</span><span class="string"><font color="#0000ff">"chb.test.reflect.Student"</font></span><span>); &nbsp;&nbsp;</span></span>
    <li><span>Method m = cls.getDeclaredMethod(</span><span class="string"><font color="#0000ff">"方法名"</font></span><span>,</span><span class="keyword"><strong><font color="#006699">new</font></strong></span><span> Class[]{</span><span class="keyword"><strong><font color="#006699">int</font></strong></span><span>.</span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span>,String.</span><span class="keyword"><strong><font color="#006699">class</font></strong></span><span>}); &nbsp;&nbsp;</span>
    <li class="alt"><span>m.invoke(cls.newInstance(),20,</span><span class="string"><font color="#0000ff">"chb"</font></span><span>);</span></li>
</ol>
&nbsp;&nbsp;&nbsp;&nbsp;总结：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用反射类调用某个类中的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class c = Class.forName("com.inspur.reflect.MethodTest");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method n = c.getDeclaredMethod("show", new Class[]{String.class,int.class});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n.invoke(c.newInstance(), "guoxzh",20);<br />
&nbsp;&nbsp;&nbsp;a.使用Class.forName("类名")来获取类<br />
&nbsp;&nbsp;&nbsp;b.其次使用getDeclaredMethods()方法获取该类所有的方法，也可以使用getDeclaredMethod("方法名",new Class[]{int.class,String.class})方法类获取具体的某一个方法<br />
&nbsp;&nbsp;&nbsp;c.接着可以使用invoke(c.newInstance,param....)来调用具体的方法。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 2.详细介绍开始使用 Reflection<br />
&nbsp;&nbsp;&nbsp; 用于 reflection 的类，如 Method，可以在 java.lang.relfect 包中找到。使用这些类的时候必须要遵循三个步骤：第一步是获得你想操作的类的 java.lang.Class 对象。在运行中的 Java 程序中，用 java.lang.Class 类来描述类和接口等。<br />
&nbsp;&nbsp;&nbsp; 下面就是获得一个 Class 对象的方法之一：<br />
&nbsp;&nbsp;&nbsp; Class c = Class.forName("java.lang.String");<br />
&nbsp;&nbsp;&nbsp; 这条语句得到一个 String 类的类对象。还有另一种方法，如下面的语句：<br />
&nbsp;&nbsp;&nbsp; Class c = int.class;<br />
&nbsp;&nbsp;&nbsp; 或者<br />
&nbsp;&nbsp;&nbsp; Class c = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp; 它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。<br />
&nbsp;&nbsp;&nbsp; 第二步是调用诸如 getDeclaredMethods 的方法，以取得该类中定义的所有方法的列表。<br />
&nbsp;&nbsp;&nbsp; 一旦取得这个信息，就可以进行第三步了——使用 reflection API 来操作这些信息，如下面这段代码：<br />
&nbsp;&nbsp;&nbsp; Class c = Class.forName("java.lang.String");<br />
&nbsp;&nbsp;&nbsp; Method m[] = c.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp; System.out.println(m[0].toString());<br />
&nbsp;&nbsp;&nbsp; 它将以文本方式打印出 String 中定义的第一个方法的原型。<br />
&nbsp;&nbsp;&nbsp; 在下面的例子中，这三个步骤将为使用 reflection 处理特殊应用程序提供例证。<br />
&nbsp;&nbsp;&nbsp; 模拟 instanceof 操作符<br />
&nbsp;&nbsp;&nbsp; 得到类信息之后，通常下一个步骤就是解决关于 Class 对象的一些基本的问题。例如，Class.isInstance 方法可以用于模拟 instanceof 操作符：<br />
&nbsp;&nbsp;&nbsp; class A {<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public class instance1 {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("A");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b1 = cls.isInstance(new Integer(37));&nbsp;&nbsp;&nbsp;//判断Integer(37)该对象是否是A类的对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b2 = cls.isInstance(new A());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 在这个例子中创建了一个 A 类的 Class 对象，然后检查一些对象是否是 A 的实例。Integer(37) 不是，但 new A() 是。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 3.找出类的方法<br />
&nbsp;&nbsp;&nbsp; 找出一个类中定义了些什么方法，这是一个非常有价值也非常基础的 reflection 用法。下面的代码就实现了这一用法：<br />
<p>package com.inspur.reflect;</p>
<p>import java.lang.reflect.Method;</p>
<p><br />
public class Methodtest1 {<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;private int abc(Object p,int x) throws NullPointerException{<br />
&nbsp;&nbsp;if(p==null)throw new NullPointerException();<br />
&nbsp;&nbsp;return x;<br />
&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;Class cls = Class.forName("com.inspur.reflect.Methodtest1");<br />
&nbsp;&nbsp;&nbsp;Method methodlist[]= cls.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp;for(int i = 0;i&lt;methodlist.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;Method m = methodlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("name=="+m.getName());//得到方法的名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("decl class=="+m.getDeclaringClass());//得到定义的类名<br />
&nbsp;&nbsp;&nbsp;&nbsp;Class prev[] = m.getParameterTypes();&nbsp;&nbsp; //取m方法中的所有参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;//遍历所有的参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int j = 0; j&lt;prev.length;j++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("param["+j+"]=="+prev[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;Class exec[] = m.getExceptionTypes(); //得到所有的异常<br />
&nbsp;&nbsp;&nbsp;&nbsp;//遍历所有的异常<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int k=0;k&lt;exec.length;k++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("execption["+k+"]=="+exec[k]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Class ret = m.getReturnType(); //得到每个方法的返回值<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("return leixing=="+ret.toString());&nbsp;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}catch(Throwable e){<br />
&nbsp;&nbsp;&nbsp;System.err.println(e.getMessage());<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>}<br />
</p>
&nbsp;&nbsp;&nbsp; 这个程序首先取得 method1 类的描述，然后调用 getDeclaredMethods 来获取一系列的 Method 对象，它们分别描述了定义在类中的每一个方法，包括 public 方法、protected 方法、package 方法和 private 方法等。<span style="color: #ff0000">如果你在程序中使用 getMethods 来代替 getDeclaredMethods</span>，你还能获得继承来的各个方法的信息。同时你也可以使用Modifier.toString(m.getModifiers())来获取方法的限制属性。<br />
&nbsp;&nbsp;&nbsp; 取得了 Method 对象列表之后，要显示这些方法的参数类型、异常类型和返回值类型等就不难了。这些类型是基本类型还是类类型，都可以由描述类的对象按顺序给出。<br />
&nbsp;&nbsp;&nbsp; 输出的结果如下：<br />
&nbsp;&nbsp;&nbsp;name==main<br />
decl class==class com.inspur.reflect.Methodtest1<br />
param[0]==class [Ljava.lang.String;<br />
return leixing==void<br />
name==abc<br />
decl class==class com.inspur.reflect.Methodtest1<br />
param[0]==class java.lang.Object<br />
param[1]==int<br />
execption[0]==class java.lang.NullPointerException<br />
return leixing==int&nbsp;&nbsp;&nbsp; 4.获取构造器信息<br />
&nbsp;&nbsp;&nbsp; 获取类构造器的用法与上述获取方法的用法类似，如：<br />
&nbsp;&nbsp;&nbsp; import java.lang.reflect.*;<br />
&nbsp;&nbsp;&nbsp; public class constructor1 {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public constructor1() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected constructor1(int i, double d) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("constructor1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ctorlist[] = cls.getDeclaredConstructors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; ctorlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ct = ctorlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + ct.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + ct.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class pvec[] = ct.getParameterTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; pvec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param #" + j + " " + pvec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class evec[] = ct.getExceptionTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; evec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("exc #" + j + " " + evec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 这个例子中没能获得返回类型的相关信息，那是因为构造器没有返回类型。<br />
这个程序运行的结果是：<br />
&nbsp;&nbsp;&nbsp; name = constructor1<br />
&nbsp;&nbsp;&nbsp; decl class = class constructor1<br />
&nbsp;&nbsp;&nbsp; -----<br />
&nbsp;&nbsp;&nbsp; name = constructor1<br />
&nbsp;&nbsp;&nbsp; decl class = class constructor1<br />
&nbsp;&nbsp;&nbsp; param #0 int<br />
&nbsp;&nbsp;&nbsp; param #1 double<br />
&nbsp;&nbsp;&nbsp; -----<br />
&nbsp;&nbsp;&nbsp; 5.获取类的字段(域)<br />
&nbsp;&nbsp;&nbsp; 找出一个类中定义了哪些数据字段也是可能的，下面的代码就在干这个事情： <br />
&nbsp;&nbsp;&nbsp; import java.lang.reflect.*;<br />
&nbsp;&nbsp;&nbsp; public class field1 {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private double d;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int i = 37;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = "testing";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("field1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fieldlist[] = cls.getDeclaredFields();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; fieldlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fld = fieldlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + fld.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + fld.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("type = " + fld.getType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mod = fld.getModifiers();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("modifiers = " + Modifier.toString(mod));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 这个例子和前面那个例子非常相似。例中使用了一个新东西 Modifier，它也是一个 reflection 类，用来描述字段成员的修饰语，如&#8220;private int&#8221;。这些修饰语自身由整数描述，而且使用 Modifier.toString 来返回以&#8220;官方&#8221;顺序排列的字符串描述 (如&#8220;static&#8221;在&#8220;final&#8221;之前)。这个程序的输出是：<br />
&nbsp;&nbsp;&nbsp; name = d<br />
&nbsp;&nbsp;&nbsp; decl class = class field1<br />
&nbsp;&nbsp;&nbsp; type = double<br />
&nbsp;&nbsp;&nbsp; modifiers = private<br />
&nbsp;&nbsp;&nbsp; -----<br />
&nbsp;&nbsp;&nbsp; name = i<br />
&nbsp;&nbsp;&nbsp; decl class = class field1<br />
&nbsp;&nbsp;&nbsp; type = int<br />
&nbsp;&nbsp;&nbsp; modifiers = public static final<br />
&nbsp;&nbsp;&nbsp; -----<br />
&nbsp;&nbsp;&nbsp; name = s<br />
&nbsp;&nbsp;&nbsp; decl class = class field1<br />
&nbsp;&nbsp;&nbsp; type = class java.lang.String<br />
&nbsp;&nbsp;&nbsp; modifiers =<br />
&nbsp;&nbsp;&nbsp; -----<br />
&nbsp;&nbsp;&nbsp; 和获取方法的情况一下，获取字段的时候也可以只取得在当前类中申明了的字段信息 (getDeclaredFields)，或者也可以取得父类中定义的字段 (getFields) 。<br />
&nbsp;&nbsp;&nbsp; 6.根据方法的名称来执行方法<br />
&nbsp;&nbsp;&nbsp; 文本到这里，所举的例子无一例外都与如何获取类的信息有关。我们也可以用 reflection 来做一些其它的事情，比如执行一个指定了名称的方法。下面的示例演示了这一操作：<br />
&nbsp;&nbsp;&nbsp; import java.lang.reflect.*;<br />
&nbsp;&nbsp;&nbsp; public class method2 {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int add(int a, int b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a + b;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("method2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class partypes[] = new Class[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[0] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[1] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method meth = cls.getMethod("add", partypes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method2 methobj = new method2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arglist[] = new Object[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[0] = new Integer(37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[1] = new Integer(47);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object retobj = meth.invoke(methobj, arglist);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer retval = (Integer) retobj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(retval.intValue());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
假如一个程序在执行的某处的时候才知道需要执行某个方法，这个方法的名称是在程序的运行过程中指定的 (例如，JavaBean 开发环境中就会做这样的事)，那么上面的程序演示了如何做到。<br />
&nbsp;&nbsp;&nbsp; 上例中，getMethod 用于查找一个具有两个整型参数且名为 add 的方法。找到该方法并创建了相应的 Method 对象之后，在正确的对象实例中执行它。执行该方法的时候，需要提供一个参数列表，这在上例中是分别包装了整数 37 和 47 的两个 Integer 对象。执行方法的返回的同样是一个 Integer 对象，它封装了返回值 84。<br />
&nbsp;&nbsp;&nbsp; 7.创建新的对象<br />
&nbsp;&nbsp;&nbsp; 对于构造器，则不能像执行方法那样进行，因为执行一个构造器就意味着创建了一个新的对象 (准确的说，创建一个对象的过程包括分配内存和构造对象)。所以，与上例最相似的例子如下：<br />
&nbsp;&nbsp;&nbsp; import java.lang.reflect.*;<br />
&nbsp;&nbsp;&nbsp; public class constructor2 {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public constructor2() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public constructor2(int a, int b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("a = " + a + " b = " + b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("constructor2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class partypes[] = new Class[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[0] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[1] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ct = cls.getConstructor(partypes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arglist[] = new Object[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[0] = new Integer(37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[1] = new Integer(47);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object retobj = ct.newInstance(arglist);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 根据指定的参数类型找到相应的构造函数并执行它，以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象，而不是在编译的时候创建对象，这一点非常有价值。<br />
&nbsp;&nbsp;&nbsp; （这里如果使用无参构造器创建对象的话，这可以直接使用Class.forName("...").newInstance();来创建对象）<br />
&nbsp;&nbsp;&nbsp; 8.改变字段(域)的值<br />
&nbsp;&nbsp;&nbsp; reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它，下面的例子可以说明这一点：<br />
&nbsp;&nbsp;&nbsp; import java.lang.reflect.*;<br />
&nbsp;&nbsp;&nbsp; public class field2 {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public double d;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("field2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fld = cls.getField("d");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; field2 f2obj = new field2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("d = " + f2obj.d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fld.setDouble(f2obj, 12.34);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("d = " + f2obj.d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 这个例子中，字段 d 的值被变为了 12.34。<br />
&nbsp;&nbsp;&nbsp; 9.使用数组<br />
&nbsp;&nbsp;&nbsp; 本文介绍的 reflection 的最后一种用法是创建的操作数组。数组在 Java 语言中是一种特殊的类类型，一个数组的引用可以赋给 Object 引用。观察下面的例子看看数组是怎么工作的：<br />
&nbsp;&nbsp;&nbsp; import java.lang.reflect.*;<br />
&nbsp;&nbsp;&nbsp; public class array1 {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("java.lang.String");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arr = Array.newInstance(cls, 10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.set(arr, 5, "this is a test");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = (String) Array.get(arr, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 例中创建了 10 个单位长度的 String 数组，为第 5 个位置的字符串赋了值，最后将这个字符串从数组中取得并打印了出来。<br />
&nbsp;&nbsp;&nbsp; 下面这段代码提供了一个更复杂的例子：<br />
&nbsp;&nbsp;&nbsp; import java.lang.reflect.*;<br />
&nbsp;&nbsp;&nbsp; public class array2 {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int dims[] = new int[]{5, 10, 15};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arr = Array.newInstance(Integer.TYPE, dims);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arrobj = Array.get(arr, 3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = arrobj.getClass().getComponentType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(cls);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arrobj = Array.get(arrobj, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.setInt(arrobj, 10, 37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int arrcast[][][] = (int[][][]) arr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(arrcast[3][5][10]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 例中创建了一个 5 x 10 x 15 的整型数组，并为处于 [3][5][10] 的元素赋了值为 37。注意，多维数组实际上就是数组的数组，例如，第一个 Array.get 之后，arrobj 是一个 10 x 15 的数组。进而取得其中的一个元素，即长度为 15 的数组，并使用 Array.setInt 为它的第 10 个元素赋值。<br />
&nbsp;&nbsp;&nbsp; 注意创建数组时的类型是动态的，在编译时并不知道其类型。<br />
<img src ="http://www.blogjava.net/forgood/aggbug/250869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2009-01-11 17:27 <a href="http://www.blogjava.net/forgood/archive/2009/01/11/250869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java和jsp中文件上传</title><link>http://www.blogjava.net/forgood/archive/2008/12/01/243774.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Mon, 01 Dec 2008 10:19:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2008/12/01/243774.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/243774.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2008/12/01/243774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/243774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/243774.html</trackback:ping><description><![CDATA[<p>jsp文件上传大多采用采用开源项目来简化处理，这里列出常用的两个jar包的实现，并进行比较，说明他们的优缺点和应该注意的问题。</p>
<p>&nbsp;Commons FileUpload，可以在<a href="http://jakarta.apache.org/commons/fileupload/">http://jakarta.apache.org/commons/fileupload/</a><a href="http://cnxhacker.net/download/">下载</a>，这个包需要Commons IO的支持，可以在<a href="http://jakarta.apache.org/commons/io/">http://jakarta.apache.org/commons/io/</a><a href="http://cnxhacker.net/download/">下载</a></p>
<p>&nbsp;com.oreilly.servlet，可以在<a href="http://www.servlets.com/cos/">http://www.servlets.com/cos/</a><a href="http://cnxhacker.net/download/">下载</a> <br />
Commons FileUpload提供三种文件上传处理方式，DiskFileUpload、ServletFileUpload和PortletFileUpload三种方式，其中DiskFileUpload已经在javadoc下已经被标记为过期的方法，建议用ServletFileUpload代替，而PortletFileUpload需要配合portlet-api来使用，所以这里我们只介绍ServletFileUpload，并且这个也是最常用的。</p>
<p>com.oreilly.servlet也提供了三种文件上传的处理方式，MultipartWrapper、MultipartRequest和MultipartParser三种方式，其中MultipartWrapper和MultipartRequest的用法基本相同，并且没有MultipartRequest提供的操作多，所以这里介绍MultipartRequest，MultipartParser和前两者有些不同，可以用来处理某些特殊情况，例如表单中有两个同名的文件上传选择框。</p>
<p>我们暂时称三面三种文件上传方式分别为：ServletFileUpload方式（MultipartTestServlet）、MultipartRequest方式（MultipartTestServlet2）、MultipartParser方式（MultipartTestServlet3）</p>
<p>代码如下：<br />
test.html</p>
<p>&lt;%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%&gt;<br />
&lt;html&gt;<br />
&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form action="MultipartTestServlet" enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form action="MultipartTestServlet2" enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;form action="MultipartTestServlet3" enctype="multipart/form-data" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="text" name="username" /&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="myfile" /&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
MultipartTestServlet.java</p>
<p>package com.bug.servlet;</p>
<p>import java.io.File;<br />
import java.io.IOException;<br />
import java.util.ArrayList;<br />
import java.util.Iterator;<br />
import java.util.List;</p>
<p>import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p>import org.apache.commons.fileupload.FileItem;<br />
import org.apache.commons.fileupload.FileUpload;<br />
import org.apache.commons.fileupload.FileUploadException;<br />
import org.apache.commons.fileupload.RequestContext;<br />
import org.apache.commons.fileupload.disk.DiskFileItemFactory;<br />
import org.apache.commons.fileupload.servlet.ServletFileUpload;<br />
import org.apache.commons.fileupload.servlet.ServletRequestContext;</p>
<p>public class MultipartTestServlet extends HttpServlet {</p>
<p>&nbsp;public MultipartTestServlet() {<br />
&nbsp; super();<br />
&nbsp;}</p>
<p>&nbsp;public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp; throws ServletException, IOException {</p>
<p>&nbsp; request.setCharacterEncoding("gbk");<br />
&nbsp; RequestContext requestContext = new ServletRequestContext(request);<br />
&nbsp; <br />
&nbsp; if(FileUpload.isMultipartContent(requestContext)){<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; DiskFileItemFactory factory = new DiskFileItemFactory();<br />
&nbsp;&nbsp; factory.setRepository(new File("c:/tmp/"));<br />
&nbsp;&nbsp; ServletFileUpload upload = new ServletFileUpload(factory);<br />
&nbsp;&nbsp; //upload.setHeaderEncoding("gbk");<br />
&nbsp;&nbsp; upload.setSizeMax(2000000);<br />
&nbsp;&nbsp; List items = new ArrayList();<br />
&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp; items = upload.parseRequest(request);<br />
&nbsp;&nbsp;&nbsp; } catch (FileUploadException e1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("文件上传发生错误" + e1.getMessage());<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; Iterator it = items.iterator();<br />
&nbsp;&nbsp; while(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp; FileItem fileItem = (FileItem) it.next();<br />
&nbsp;&nbsp;&nbsp; if(fileItem.isFormField()){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(fileItem.getFieldName() + "&nbsp;&nbsp; " + fileItem.getName() + "&nbsp;&nbsp; " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));<br />
&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(fileItem.getFieldName() + "&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.getName() + "&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.isInMemory() + "&nbsp;&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.getContentType() + "&nbsp;&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.getSize());<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; if(fileItem.getName()!=null &amp;&amp; fileItem.getSize()!=0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fullFile = new File(fileItem.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File newFile = new File("c:/temp/" + fullFile.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileItem.write(newFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("文件没有选择 或 文件内容为空");<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp;}</p>
<p>}</p>
<p>MultipartTestServlet2.java</p>
<p>package com.bug.servlet;</p>
<p>import java.io.IOException;<br />
import java.util.Enumeration;</p>
<p>import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p>import com.oreilly.servlet.MultipartRequest;<br />
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;</p>
<p>public class MultipartTestServlet2 extends HttpServlet {</p>
<p>&nbsp;public MultipartTestServlet2() {<br />
&nbsp; super();<br />
&nbsp;}</p>
<p>&nbsp;public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp; throws ServletException, IOException {</p>
<p>&nbsp; //request.setCharacterEncoding("gbk");&nbsp; 不起作用<br />
&nbsp; System.out.println("start ");<br />
&nbsp; MultipartRequest multi = new MultipartRequest(request, "c:/tmp/", 2*1024*1024, "gbk", new DefaultFileRenamePolicy());<br />
&nbsp; System.out.println("start ");<br />
&nbsp; Enumeration filesName = multi.getFileNames();<br />
&nbsp; Enumeration paramsName = multi.getParameterNames();<br />
&nbsp; while(paramsName.hasMoreElements()){<br />
&nbsp;&nbsp; String paramName = (String) paramsName.nextElement();<br />
&nbsp;&nbsp; System.out.println(multi.getParameter(paramName));<br />
&nbsp; }<br />
&nbsp; while(filesName.hasMoreElements()){<br />
&nbsp;&nbsp; String fileName = (String) filesName.nextElement();<br />
&nbsp;&nbsp; System.out.println(multi.getFilesystemName(fileName) + "&nbsp; " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multi.getOriginalFileName(fileName) + "&nbsp; " + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multi.getContentType(fileName) + "&nbsp; ");<br />
&nbsp;&nbsp; if(multi.getFilesystemName(fileName)!=null &amp;&amp; !multi.getFilesystemName(fileName).equals(""))<br />
&nbsp;&nbsp;&nbsp; System.out.println(multi.getFile(fileName).toURI());<br />
&nbsp; }<br />
&nbsp;}<br />
&nbsp;<br />
}</p>
<p>MultipartTestServlet3.java</p>
<p>package com.bug.servlet;</p>
<p>import java.io.File;<br />
import java.io.IOException;</p>
<p>import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p>import com.oreilly.servlet.multipart.FilePart;<br />
import com.oreilly.servlet.multipart.MultipartParser;<br />
import com.oreilly.servlet.multipart.ParamPart;<br />
import com.oreilly.servlet.multipart.Part;</p>
<p>public class MultipartTestServlet3 extends HttpServlet {</p>
<p>&nbsp;public MultipartTestServlet3() {<br />
&nbsp; super();<br />
&nbsp;}</p>
<p>&nbsp;public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp; throws ServletException, IOException {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MultipartParser mp = new MultipartParser(request, 2*1024*1024, false, false, "gbk");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Part part;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((part = mp.readNextPart()) != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = part.getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (part.isParam()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ParamPart paramPart = (ParamPart) part;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String value = paramPart.getStringValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param: name=" + name + "; value=" + value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (part.isFile()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // it's a file part<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilePart filePart = (FilePart) part;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = filePart.getFileName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileName != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long size = filePart.writeTo(new File("c:/tmp/"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("file: name=" + name + "; fileName=" + fileName +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", filePath=" + filePart.getFilePath() + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", contentType=" + filePart.getContentType() + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", size=" + size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("file: name=" + name + "; EMPTY");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; } </p>
<p>}</p>
<p>web.xml中加入</p>
<p>&nbsp;&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.bug.servlet.MultipartTestServlet&lt;/servlet-class&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet2&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.bug.servlet.MultipartTestServlet2&lt;/servlet-class&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet3&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.bug.servlet.MultipartTestServlet3&lt;/servlet-class&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/MultipartTestServlet&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet2&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/MultipartTestServlet2&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;MultipartTestServlet3&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/MultipartTestServlet3&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;</p>
<p>问题1、中文问题：<br />
&nbsp;三种凡是都可以通过自己的方法来设置encoding为gbk开处理和解决中文问题，包括初始化的时候传入gbk作为参数，或是是初始化后通过setEncoding的方式来实现。<br />
&nbsp;另外ServletFileUpload方式也可以通过request.setCharacterEncoding("gbk");的方式来实现，而其它两种方式不支持这种方式。</p>
<p><br />
问题2、文件大小限制<br />
&nbsp;ServletFileUpload方式可以设置文件大小限制，也可以不用设置，例子中的upload.setSizeMax(2000000)就可以注释掉。如果设置upload.setSizeMax(-1)，表明不限制上传的大小。文档中没有指明默认的限制的多少，我在不设置的情况下上传了一个9M的东西，可以上传，估计默认是不限制大小的。<br />
&nbsp;而MultipartRequest方式和MultipartParser方式是必须设置文件的上传文件的大小限制的，如果不设置，默认是1M的大小限制。</p>
<p><br />
问题3、文件上传发生错误<br />
&nbsp;如果文件上传过程中发生任何错误，或者是文件的大小超出了范围，系统都将抛出错误。<br />
&nbsp;ServletFileUpload方式在upload.parseRequest(request)时抛出错误<br />
&nbsp;MultipartRequest方式在new MultipartRequest(。。。)时抛出错误<br />
&nbsp;MultipartParser方式在new MultipartParser(。。。)时抛出错误</p>
<p><br />
问题4、上传同名文件时，他们保存到临时目录是的冲突问题<br />
&nbsp;ServletFileUpload方式，不会有冲突，系统会把上传得文件按照一定的规则重新命名，保证不会冲突<br />
&nbsp;MultipartParser方式，会产生冲突，系统会把文件按照上传时的文件名，保存到临时目录下，如果两个用会同时上传文件名相同的文件，那么就可能会产生冲突，一方把另一方的临时文件给替换了。<br />
&nbsp;MultipartRequest方式，在初始化时如果提供了一个名称转换策略，就不会有冲突，如果不提桶，就会有冲突。在上面的例子中我们提供了一个new DefaultFileRenamePolicy()保证了文件名不会有冲突发生。</p>
<p><br />
问题5：表单中有两个同名的文件上传选择框，就像我们例子中的myfile一样，每个表单中有两个name=&#8220;myfile&#8221;的上传框<br />
&nbsp;ServletFileUpload方式，可以处理，可以分别得到他们各自的文件，<br />
&nbsp;MultipartRequest方式，不可以处理，会发生冲突，会有一个上传框的文件覆盖了另外一个。<br />
&nbsp;MultipartParser方式，可以处理，可以分别得到他们各自的文件，</p>
<p><br />
备注：<br />
&nbsp;代码比较乱，主要是为了说明他们间的区别。他们的详细地使用说明还是要参考他的javadoc和domo。</p>
<p>参考：<br />
&nbsp;1、<a href="http://www.servlets.com/cos/#classes">http://www.servlets.com/cos/#classes</a><br />
&nbsp;2、<a href="http://jakarta.apache.org/commons/fileupload/apidocs/index.html">http://jakarta.apache.org/commons/fileupload/apidocs/index.html</a><br />
&nbsp;3、<a href="http://jakarta.apache.org/commons/fileupload/using.html">http://jakarta.apache.org/commons/fileupload/using.html</a><br />
&nbsp;4、<a href="http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3">http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3</a></p>
<img src ="http://www.blogjava.net/forgood/aggbug/243774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2008-12-01 18:19 <a href="http://www.blogjava.net/forgood/archive/2008/12/01/243774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java栈与堆 </title><link>http://www.blogjava.net/forgood/archive/2008/11/30/243536.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Sun, 30 Nov 2008 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2008/11/30/243536.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/243536.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2008/11/30/243536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/243536.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/243536.html</trackback:ping><description><![CDATA[Java栈与堆 <br />
<br />
----对这两个概念的理解总是忘记，今天从网上搜到一篇比较好的文章收藏<br />
<br />
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同，Java自动管理栈和堆，程序员不能直接地设置栈或堆。 <br />
<br />
2. 栈的优势是，存取速度比堆要快，仅次于直接位于CPU中的寄存器。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。另外，栈数据可以共享，详见第3点。堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。 <br />
<br />
3. Java中的数据类型有两种。 <br />
<br />
一种是基本类型(primitive types), 共有8种，即int, short, long, byte, float, double, boolean, char(注意，并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的，称为自动变量。值得注意的是，自动变量存的是字面值，不是类的实例，即不是类的引用，这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用，指向3这个字面值。这些字面值的数据，由于大小可知，生存期可知(这些字面值固定定义在某个程序块里面，程序块退出后，字段值就消失了)，出于追求速度的原因，就存在于栈中。 <br />
<br />
另外，栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时定义： <br />
复制内容到剪贴板代码: <br />
int a = 3; <br />
int b = 3； <br />
编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找有没有字面值为3的地址，没找到，就开辟一个存放3这个字面值的地址，然后将a指向3的地址。接着处理int b = 3；在创建完b的引用变量后，由于在栈中已经有3这个字面值，便将b直接指向3的地址。这样，就出现了a与b同时均指向3的情况。 <br />
<br />
特别注意的是，这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象，如果一个对象引用变量修改了这个对象的内部状态，那么另一个对象引用变量也即刻反映出这个变化。相反，通过字面值的引用来修改其值，不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例，我们定义完a与b的值后，再令a=4；那么，b不会等于4，还是等于3。在编译器内部，遇到a=4；时，它就会重新搜索栈中是否有4的字面值，如果没有，重新开辟地址存放4的值；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。 <br />
<br />
另一种是包装类数据，如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中，Java用new()语句来显示地告诉编译器，在运行时才根据需要动态创建，因此比较灵活，但缺点是要占用更多的时间。 4. String是一个特殊的包装类数据。即可以用String str = new String("abc");的形式来创建，也可以用String str = "abc"；的形式来创建(作为对比，在JDK 5.0之前，你从未见过Integer i = 3;的表达式，因为类与字面值是不能通用的，除了String。而在JDK 5.0中，这种表达式是可以的！因为编译器在后台进行Integer i = new Integer(3)的转换)。前者是规范的类的创建过程，即在Java中，一切都是对象，而对象是类的实例，全部通过new()的形式来创建。Java中的有些类，如DateFormat类，可以通过该类的getInstance()方法来返回一个新创建的类，似乎违反了此原则。其实不然。该类运用了单例模式来返回类的实例，只不过这个实例是在该类内部通过new()来创建的，而getInstance()向外部隐藏了此细节。那为什么在String str = "abc"；中，并没有通过new()来创建实例，是不是违反了上述原则？其实没有。 <br />
<br />
5. 关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤： <br />
<br />
(1)先定义一个名为str的对String类的对象引用变量：String str； <br />
<br />
(2)在栈中查找有没有存放值为"abc"的地址，如果没有，则开辟一个存放字面值为"abc"的地址，接着创建一个新的String类的对象o，并将o的字符串值指向这个地址，而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址，则查找对象o，并返回o的地址。 <br />
<br />
(3)将str指向对象o的地址。 <br />
<br />
值得注意的是，一般String类中字符串值都是直接存值的。但像String str = "abc"；这种场合下，其字符串值却是保存了一个指向存在栈中数据的引用！ <br />
<br />
为了更好地说明这个问题，我们可以通过以下的几个代码进行验证。 <br />
复制内容到剪贴板代码: <br />
String str1 = "abc"; <br />
String str2 = "abc"; <br />
System.out.println(str1==str2); //true <br />
注意，我们这里并不用str1.equals(str2)；的方式，因为这将比较两个字符串的值是否相等。==号，根据JDK的说明，只有在两个引用都指向了同一个对象时才返回真值。而我们在这里要看的是，str1与str2是否都指向了同一个对象。 <br />
结果说明，JVM创建了两个引用str1和str2，但只创建了一个对象，而且两个引用都指向了这个对象。 <br />
<br />
我们再来更进一步，将以上代码改成： <br />
复制内容到剪贴板代码: <br />
String str1 = "abc"; <br />
String str2 = "abc"; <br />
str1 = "bcd"; <br />
System.out.println(str1 + "," + str2); //bcd, abc <br />
System.out.println(str1==str2); //false <br />
这就是说，赋值的变化导致了类对象引用的变化，str1指向了另外一个新对象！而str2仍旧指向原来的对象。上例中，当我们将str1的值改为"bcd"时，JVM发现在栈中没有存放该值的地址，便开辟了这个地址，并创建了一个新的对象，其字符串的值指向这个地址。 <br />
<br />
事实上，String类被设计成为不可改变(immutable)的类。如果你要改变其值，可以，但JVM在运行时根据新值悄悄创建了一个新对象，然后将这个对象的地址返回给原来类的引用。这个创建过程虽说是完全自动进行的，但它毕竟占用了更多的时间。在对时间要求比较敏感的环境中，会带有一定的不良影响。 <br />
<br />
再修改原来代码： <br />
复制内容到剪贴板代码: <br />
String str1 = "abc"; <br />
String str2 = "abc"; <br />
<br />
str1 = "bcd"; <br />
<br />
String str3 = str1; <br />
System.out.println(str3); //bcd <br />
<br />
String str4 = "bcd"; <br />
System.out.println(str1 == str4); //true <br />
str3这个对象的引用直接指向str1所指向的对象(注意，str3并没有创建新对象)。当str1改完其值后，再创建一个String的引用str4，并指向因str1修改值而创建的新的对象。可以发现，这回str4也没有创建新的对象，从而再次实现栈中数据的共享。 <br />
<br />
我们再接着看以下的代码。 <br />
复制内容到剪贴板代码: <br />
String str1 = new String("abc"); <br />
String str2 = "abc"; <br />
System.out.println(str1==str2); //false 创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。 <br />
<br />
String str1 = "abc"; <br />
String str2 = new String("abc"); <br />
System.out.println(str1==str2); //false <br />
创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。 <br />
<br />
以上两段代码说明，只要是用new()来新建对象的，都会在堆中创建，而且其字符串是单独存值的，即使与栈中的数据相同，也不会与栈中的数据共享。 <br />
<br />
6. 数据类型包装类的值不可修改。不仅仅是String类的值不可修改，所有的数据类型包装类都不能更改其内部的值。 <br />
7. 结论与建议： <br />
<br />
(1)我们在使用诸如String str = "abc"；的格式定义类时，总是想当然地认为，我们创建了String类的对象str。担心陷阱！对象可能并没有被创建！唯一可以肯定的是，指向String类的引用被创建了。至于这个引用到底是否指向了一个新的对象，必须根据上下文来考虑，除非你通过new()方法来显要地创建一个新的对象。因此，更为准确的说法是，我们创建了一个指向String类的对象的引用变量str，这个对象引用变量指向了某个值为"abc"的String类。清醒地认识到这一点对排除程序中难以发现的bug是很有帮助的。 <br />
<br />
(2)使用String str = "abc"；的方式，可以在一定程度上提高程序的运行速度，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值是否相等，是否有必要创建新对象，从而加重了程序的负担。这个思想应该是享元模式的思想，但JDK的内部在这里实现是否应用了这个模式，不得而知。 <br />
<br />
(3)当比较包装类里面的数值是否相等时，用equals()方法；当测试两个包装类的引用是否指向同一个对象时，用==。 <br />
<br />
(4)由于String类的immutable性质，当String变量需要经常变换其值时，应该考虑使用StringBuffer类，以提高程序效率。
<img src ="http://www.blogjava.net/forgood/aggbug/243536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2008-11-30 14:29 <a href="http://www.blogjava.net/forgood/archive/2008/11/30/243536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中压缩与解压缩的实现</title><link>http://www.blogjava.net/forgood/archive/2008/09/16/229247.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Tue, 16 Sep 2008 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2008/09/16/229247.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/229247.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2008/09/16/229247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/229247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/229247.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 压缩的import&nbsp;java.io.BufferedInputStream;import&nbsp;java.io.BufferedOutputStream;import&nbsp;java.io.File;import&nbsp;java.io.FileInputStream;import&nbsp;java.io.FileOutputStream;import...&nbsp;&nbsp;<a href='http://www.blogjava.net/forgood/archive/2008/09/16/229247.html'>阅读全文</a><img src ="http://www.blogjava.net/forgood/aggbug/229247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2008-09-16 20:52 <a href="http://www.blogjava.net/forgood/archive/2008/09/16/229247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA解析XML配置文件的读取操作 </title><link>http://www.blogjava.net/forgood/archive/2008/09/09/227916.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Tue, 09 Sep 2008 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2008/09/09/227916.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/227916.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2008/09/09/227916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/227916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/227916.html</trackback:ping><description><![CDATA[现在关键是如何读取XML配置文件？有好几种XML解析器：主要有DOM和SAX ，这些区别网上文章介绍很多。
<p>&nbsp;&nbsp;&nbsp; 在apache的XML项目组中，目前有Xerces Xalan Cocoon几个开发XML相关技术的project.Tomcat本身使用的是 Sun 的 JAXP，而其XSL Taglib project中使用Xerces解析器。
<p>&nbsp;&nbsp;&nbsp; 好了，上面都是比较烦人的理论问题，还是赶快切入XML的配置文件的读取吧。
<p>&nbsp;&nbsp;&nbsp; 在我们的程序中，通常要有一些根据主机环境确定的变量。比如数据库访问用户名和密码，不同的主机可能设置不一样。只要更改XML配置文件，就可以正常运行。
<p><code><br />
localhost<br />
sqlname<br />
username<br />
password</code>
<p>&nbsp;&nbsp;&nbsp; 上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下.
<p>
<p>&nbsp;&nbsp;&nbsp; 我们编制一个Java程序直接读取,将dbhost dbuser dbpassword提取出来供其他程序访问数据库用.
<p>
<p>&nbsp;&nbsp;&nbsp; 目前使用SAX比较的多,与DOM主要区别是 SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件.这里我们使用SAX解析,由于SAX解析器不断在发展,网上有不少文章是针对老版本的.如果你使用JDK1.4 ,可以参考 使用SAX处理XML文档 一文.这里的程序是根据其改进并且经过实践调试得来的.
<p>
<p>对上面myenv.xml读取的Java程序:
<p><code><br />
import org.xml.sax.Attributes;<br />
import org.xml.sax.helpers.DefaultHandler;<br />
import org.xml.sax.SAXException;<br />
import java.util.Properties;<br />
<br />
//使用DefaultHandler的好处 是 不必陈列出所有方法,<br />
public class ConfigParser extends DefaultHandler {<br />
<br />
////定义一个Properties 用来存放 dbhost dbuser dbpassword的值<br />
private Properties props;<br />
<br />
private String currentSet;<br />
private String currentName;<br />
private StringBuffer currentValue = new StringBuffer();<br />
<br />
//构建器初始化props<br />
public ConfigParser() {<br />
<br />
this.props = new Properties();<br />
}<br />
<br />
public Properties getProps() {<br />
return this.props;<br />
}<br />
<br />
//定义开始解析元素的方法. 这里是将 中的名称xxx提取出来.<br />
public void startElement(String uri, String localName, String qName, Attributes attributes)<br />
throws SAXException {<br />
currentValue.delete(0, currentValue.length());<br />
this.currentName =qName;<br />
<br />
}<br />
<br />
//这里是将 之间的值加入到currentValue<br />
<br />
public void characters(char[] ch, int start, int length) throws SAXException {<br />
<br />
currentValue.append(ch, start, length);<br />
<br />
}<br />
<br />
//在遇到 结束后,将之前的名称和值一一对应保存在props中<br />
<br />
public void endElement(String uri, String localName, String qName) throws SAXException {<br />
<br />
props.put(qName.toLowerCase(), currentValue.toString().trim());<br />
}<br />
<br />
}</code>
<p>
<p>
<p>&nbsp;&nbsp;&nbsp; 上面的这个解析程序比较简单吧? 其实解析XML就是这么简单.
<p>
<p>&nbsp;&nbsp;&nbsp; 现在我们已经将dbhost dbuser dbpassword的值localhost sqlname username password提取了出来.但是这只是在在解析器内部,我们的程序还不能访问.需要再编制一个程序.
<p>
<p>
<p><code><br />
import java.util.Properties;<br />
import javax.xml.parsers.SAXParser;<br />
import javax.xml.parsers.SAXParserFactory;<br />
import java.net.URL;<br />
<br />
public class ParseXML{<br />
<br />
//定义一个Properties 用来存放 dbhost dbuser dbpassword的值<br />
private Properties props;<br />
<br />
//这里的props<br />
public Properties getProps() {<br />
return this.props;<br />
}<br />
<br />
public void parse(String filename) throws Exception {<br />
<br />
//将我们的解析器对象化<br />
ConfigParser handler = new ConfigParser();<br />
<br />
//获取SAX工厂对象<br />
SAXParserFactory factory = SAXParserFactory.newInstance();<br />
factory.setNamespaceAware(false);<br />
factory.setValidating(false);<br />
<br />
//获取SAX解析<br />
SAXParser parser = factory.newSAXParser();<br />
<br />
//得到配置文件myenv.xml所在目录. tomcat中是在WEB-INF/classes<br />
//下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替或定义<br />
URL confURL = BeansConstants.class.getClassLoader().getResource(filename);<br />
<br />
try<br />
{<br />
//将解析器和解析对象myenv.xml联系起来,开始解析<br />
parser.parse(confURL.toString(), handler);<br />
//获取解析成功后的属性 以后 我们其他应用程序只要调用本程序的props就可以提取出属性名称和值了<br />
props = handler.getProps();<br />
}finally{<br />
factory=null;<br />
parser=null;<br />
handler=null;<br />
}<br />
<br />
}<br />
<br />
}</code>
<p>
<p>
<p>&nbsp;&nbsp;&nbsp; 由于我们的XML文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了.
<p>
<p>&nbsp;&nbsp;&nbsp; 判断一个程序系统的先进性,我们先看看他的配置文件,如果还在使用老套的xxx=123 这样类似.ini的文件, </p>
<img src ="http://www.blogjava.net/forgood/aggbug/227916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2008-09-09 12:49 <a href="http://www.blogjava.net/forgood/archive/2008/09/09/227916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎么得到ucs2字符串中制定位数</title><link>http://www.blogjava.net/forgood/archive/2008/09/08/227824.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Mon, 08 Sep 2008 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2008/09/08/227824.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/227824.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2008/09/08/227824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/227824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/227824.html</trackback:ping><description><![CDATA[&nbsp;Web应用程序在浏览器中显示字符串时，由于显示长度的限制，常常需要将字符串截取后再进行显示。但目前很多流行的语言，如<a class="channel_keylink" href="http://dotnet.chinaitlab.com/List_233.html" target="_blank">C#</a>、<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank">Java</a>内部采用的都是 Unicode 16（UCS2）编码，在这种编码中所有的字符都是两个字符，因此，如果要截取的字符串是中、英文、数字混合的，就会产生问题，如下面的字符串：<br />
<br />
<div align="center">
<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000" twffan="done">String&nbsp;s&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">a加b等于c，如果a等1、b等于2，那么c等3</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">; <br />
</div>
</span></div>
</div>
<br />
&nbsp;&nbsp;&nbsp; 上面的字符串既有汉字，又有英文字符和数字。如果要截取前6个字节的字符，应该是&#8221;a加b等"，但如果用substring方法截取前6个字符就成了"a 加b等于c"。产生这个问题的原因是将substring方法将双字节的汉字当成一个字节的字符（UCS2字符）处理了。要解决这个问题的方法是首先得到该字符串的UCS2编码的字节数组，如下面的代码如下：<br />
<br />
<div align="center">
<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff" twffan="done">byte</span><span style="color: #000000" twffan="done">[]&nbsp;bytes&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;s.getBytes(</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">Unicode</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">);</span></div>
</div>
</div>
<br />
&nbsp;&nbsp;&nbsp; 由于上面生成的字节数组中前两个字节是标志位，bytes[0] = -2，bytes[1] = -1，因此，要从第三个字节开始扫描，对于一个英文或数字字符，UCS2编码的第二个字节是相应的ASCII，第一个字节是0，如a的UCS2编码是0&nbsp; 97，而汉字两个字节都不为0，因此，可以利于UCS2编码的这个规则来计算实际的字节数，该方法的实现代码如下：<br />
<br />
<div align="center">
<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">public</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #0000ff" twffan="done">static</span><span style="color: #000000" twffan="done">&nbsp;String&nbsp;bSubstring(String&nbsp;s,&nbsp;</span><span style="color: #0000ff" twffan="done">int</span><span style="color: #000000" twffan="done">&nbsp;length)&nbsp;</span><span style="color: #0000ff" twffan="done">throws</span><span style="color: #000000" twffan="done">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">byte</span><span style="color: #000000" twffan="done">[]&nbsp;bytes&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;s.getBytes(</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">Unicode</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">int</span><span style="color: #000000" twffan="done">&nbsp;n&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">0</span><span style="color: #000000" twffan="done">;&nbsp;</span><span style="color: #008000" twffan="done">//</span><span style="color: #008000" twffan="done">&nbsp;表示当前的字节数</span><span style="color: #008000" twffan="done"><br />
</span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">int</span><span style="color: #000000" twffan="done">&nbsp;i&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">2</span><span style="color: #000000" twffan="done">;&nbsp;</span><span style="color: #008000" twffan="done">//</span><span style="color: #008000" twffan="done">&nbsp;要截取的字节数</span><span style="color: #008000" twffan="done">，从第3个字节开始<br />
</span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">for</span><span style="color: #000000" twffan="done">&nbsp;(;&nbsp;i&nbsp;</span><span style="color: #000000" twffan="done">&lt;</span><span style="color: #000000" twffan="done">&nbsp;bytes.length&nbsp;</span><span style="color: #000000" twffan="done">&amp;&amp;</span><span style="color: #000000" twffan="done">&nbsp;n&nbsp;</span><span style="color: #000000" twffan="done">&lt;</span><span style="color: #000000" twffan="done">&nbsp;length;&nbsp;i</span><span style="color: #000000" twffan="done">++</span><span style="color: #000000" twffan="done">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000" twffan="done">//</span><span style="color: #008000" twffan="done">&nbsp;奇数位置，如3、5、7等，为UCS2编码中两个字节的第二个字节</span><span style="color: #008000" twffan="done"><br />
</span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">if</span><span style="color: #000000" twffan="done">&nbsp;(i&nbsp;</span><span style="color: #000000" twffan="done">%</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">2</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">==</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">1</span><span style="color: #000000" twffan="done">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n</span><span style="color: #000000" twffan="done">++</span><span style="color: #000000" twffan="done">;&nbsp;</span><span style="color: #008000" twffan="done">//</span><span style="color: #008000" twffan="done">&nbsp;在UCS2第二个字节时n加1</span><span style="color: #008000" twffan="done"><br />
</span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">else</span><span style="color: #000000" twffan="done"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000" twffan="done">//</span><span style="color: #008000" twffan="done">&nbsp;当UCS2编码的第一个字节不等于0时，该UCS2字符为汉字，一个汉字算两个字节</span><span style="color: #008000" twffan="done"><br />
</span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">if</span><span style="color: #000000" twffan="done">&nbsp;(bytes[i]&nbsp;</span><span style="color: #000000" twffan="done">!=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">0</span><span style="color: #000000" twffan="done">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n</span><span style="color: #000000" twffan="done">++</span><span style="color: #000000" twffan="done">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000" twffan="done">//</span><span style="color: #008000" twffan="done">&nbsp;如果i为奇数时，处理成偶数</span><span style="color: #008000" twffan="done"><br />
</span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">if</span><span style="color: #000000" twffan="done">&nbsp;(i&nbsp;</span><span style="color: #000000" twffan="done">%</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">2</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">==</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">1</span><span style="color: #000000" twffan="done">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000" twffan="done">//</span><span style="color: #008000" twffan="done">&nbsp;该UCS2字符是汉字时，去掉这个截一半的汉字</span><span style="color: #008000" twffan="done"><br />
</span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">if</span><span style="color: #000000" twffan="done">&nbsp;(bytes[i - 1]&nbsp;</span><span style="color: #000000" twffan="done">!=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">0</span><span style="color: #000000" twffan="done">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;i&nbsp;</span><span style="color: #000000" twffan="done">-</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">1</span><span style="color: #000000" twffan="done">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000" twffan="done">//</span><span style="color: #008000" twffan="done">&nbsp;该UCS2字符是字母或数字，则保留该字符</span><span style="color: #008000" twffan="done"><br />
</span><span style="color: #000000" twffan="done">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">else</span><span style="color: #000000" twffan="done"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;i&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">1</span><span style="color: #000000" twffan="done">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">return</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #0000ff" twffan="done">new</span><span style="color: #000000" twffan="done">&nbsp;String(bytes,&nbsp;</span><span style="color: #000000" twffan="done">0</span><span style="color: #000000" twffan="done">,&nbsp;i,&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">Unicode</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</div>
</span></div>
</div>
<br />
&nbsp;&nbsp;&nbsp; 下面代码使用了bSubstring方法：<br />
<br />
<div align="center">
<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000" twffan="done">String&nbsp;s&nbsp;</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">a加b等于c，如果a等1、b等于2，那么c等3</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">;<br />
System.out.println(bSubstring(s, </span><span style="color: #000000" twffan="done">6</span><span style="color: #000000" twffan="done">));</span></div>
</div>
</div>
<br />
&nbsp;&nbsp;&nbsp; 上面的代码截取的字符串是<span style="color: #000000" twffan="done">"</span>a加b等<span style="color: #000000" twffan="done">"</span>。 
<img src ="http://www.blogjava.net/forgood/aggbug/227824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2008-09-08 23:02 <a href="http://www.blogjava.net/forgood/archive/2008/09/08/227824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 详解Eclipse+MyEclipse完全绿色版制作方法 </title><link>http://www.blogjava.net/forgood/archive/2008/08/07/220783.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Thu, 07 Aug 2008 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2008/08/07/220783.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/220783.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2008/08/07/220783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/220783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/220783.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/bolo/archive/2008/08/07/220696.html">[转载] 详解Eclipse+MyEclipse完全绿色版制作方法</a> </div>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">现在在Java开发中，使用的开发工具大部分都是Eclipse，并且和Eclipse关系紧密的要数MyEclipse了，但是MyEclipse是一个EXE可执行程序，对于没有安装Eclipse与MyEclilpse的电脑来说，首先得先解压Eclipse，然后再安装MyEclipse，这不光很麻烦，而且还很费时，对于已经安装好的电脑来说，如果哪天电脑出了问题或是Eclipse崩溃了，导致工具不能用，这时又不得不重新安装时，那可真够郁闷滴～～～，因此，大象本着我为人人，人人为我的奉献精神，在此，将Eclipse+MyEclipse的完全绿色版制作方法写出来，和大家一起分享，让大家都能享受到这种方便。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这里，大象采用Eclipse3.3.1与MyEclipse_6.0.1GA_E3.3.1_Installer版来举例说明，其它的版本做法与此相同。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff"><span style="color: #0000ff"><strong>第1步：下载Eclipse3.3.1和MyEclipse_6.0.1GA<br />
</strong><span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里我要提醒大家注意一下：下载</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Eclipse</span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">时不要选择</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">3.2</span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的版本，因为</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">MyEclipse6.0</span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">需要</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">3.3</span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">版本以上的支持，另外就是下载</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">MyEclipse</span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">时不要下完全版，而应该只下插件版，我的这个</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">MyEclipse6.0.1</span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的插件版是</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">176M。<br />
<img height="34" alt="" hspace="2" src="http://www.blogjava.net/images/blogjava_net/bolo/eclipse/1.JPG" width="495" vspace="5" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="font-size: 10pt; color: blue; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">第</span><span lang="EN-US" style="font-size: 10pt; color: blue; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">2</span></strong><strong><span style="font-size: 10pt; color: blue; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">步：解压</span><span lang="EN-US" style="font-size: 10pt; color: blue; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Eclipse3.3.1</span></strong>&nbsp;<br />
<span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Eclipse3.3.1</span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的压缩包解压到</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">D</span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">盘根目录下。<br />
<img height="256" alt="" src="http://www.blogjava.net/images/blogjava_net/bolo/eclipse/2.JPG" width="505" border="0" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;做这个绿色版，把它放在根目录下是因为这样做很方便，<span style="color: #ff0000">在这里，大象以D盘为例，来说明制作方法。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff"><strong>第3步：安装MyEclipse6.0.1GA<br />
</strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;双击"<font style="color: #ff0000" face="宋体" color="#0000ff" size="2">MyEclipse_6.0.1GA_E3.3.1_Installer.exe</font>"开始安装MyEclipse，在第3步:"Choose Eclipse Folder"时，注意 "Please Choose Existing Eclipse Installation Folder"，点击"Choose...",请选择你解压的Eclipse文件夹，选择好之后如下图：<br />
<img height="465" alt="" src="http://www.blogjava.net/images/blogjava_net/bolo/eclipse/4.JPG" width="622" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击"Next"，出现"Where Would You Like to Install MyEclipse 6.0.1?",点击"Choose...",选择上面的eclipse文件夹，这时记得在eclipse后面加一个目录名，否则，MyEclipse的安装文件就会全部放在eclipse的根目录下，这可不是我们希望看到滴，设置好之后如下图:<br />
<img height="467" alt="" hspace="2" src="http://www.blogjava.net/images/blogjava_net/bolo/eclipse/5.JPG" width="622" vspace="5" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面的安装没什么好说的，就是一路Next了。安装结束后，可以在eclipse目录下看到有一个"MyEclipse 6.0.1GA"这个文件夹,进去看看，是不是有两个文件夹，两个文件？<br />
<img height="71" alt="" hspace="2" src="http://www.blogjava.net/images/blogjava_net/bolo/eclipse/10.JPG" width="438" vspace="5" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OK,到此MyEclipse插件已经安装完成了，下面来进行我们的绿色插件制作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff"><strong>第4步：插件制作<br />
</strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在eclipse目录下，新建一个文件夹，命名为"<font style="background-color: #ffffff" face="宋体" size="2">ThirdPlugins</font>"（你要取别的名字也可以，不过一定要和links目录里面的配置文件中的路径一致，后面会有说明),将"MyEclipse 6.0.1GA"这个文件夹复制到"ThirdPlugins"目录下，别用剪切喔，这可是刚才安装MyEclipse的目录，等会还要缷载MyEclipse，如果这个目录没有了，到时缷载不了，出了什么问题可不要怪大象喔！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyEclipse安装好之后，会在eclipse目录下生成一个links文件夹，里面有一个"com.genuitec.eclipse.MyEclipse.link"文件，我们删除它，另外新建一个"MyEclipse 6.0.1GA.ini"文件，内容为：<span style="color: #ff0000">path=ThirdPlugins/MyEclipse 6.0.1GA<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">保存完之后，我们的插件制作也结束了，然后就是缷载MyEclipse，千万不要直接把那个文件夹删掉，而应该缷载它。<br />
<img height="74" alt="" hspace="2" src="http://www.blogjava.net/images/blogjava_net/bolo/eclipse/9.JPG" width="381" vspace="5" border="0" /><br />
<img height="79" alt="" hspace="2" src="http://www.blogjava.net/images/blogjava_net/bolo/eclipse/8.JPG" width="347" vspace="5" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实所有的插件都可以按这个方式来做，这样做的好处就是，想用就放进去，不想用就删掉，如果放到eclipse的features和plugins里面，会很不好管理。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff"><strong>第5步：配置参数</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虽然插件已经安装好了，但是，此时我们还不能启动它，应该对eclipse的启动参数设置一下，提高它的启动速度和运行时的稳定性。在eclipse.exe上点右键，选择"创建快捷方式"，在快捷方式上点右键，选择"属性"，在"D:\eclipse\eclipse.exe后面加上空格，将这些参数加在后面：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">-vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -XX:MaxPermSize=128M -Xms256M -Xmx512M<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">-Xms256M -Xmx512M：这是堆，根据内存大小来设置，比如大象的内存是1G,我就设成256和512，这样一般都够用了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然了，你也可以什么都不设置，不过大象还是建议设置这些参数，可以很大程度上提升eclipse的启动速度。在安装完MyEclipse时，还会生成一个eclipse.ini的备份文件，这个不需要，删掉。我们可以修改下eclipse.ini文件，原始的如下：</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: #000000">-</span><span style="color: #000000">showsplash<br />
com.genuitec.myeclipse.product<br />
</span><span style="color: #000000">--</span><span style="color: #000000">launcher.XXMaxPermSize<br />
256m<br />
</span><span style="color: #000000">-</span><span style="color: #000000">vmargs<br />
</span><span style="color: #000000">-</span><span style="color: #000000">Xms128m<br />
</span><span style="color: #000000">-</span><span style="color: #000000">Xmx512m<br />
</span><span style="color: #000000">-</span><span style="color: #000000">Dosgi.splashLocation</span><span style="color: #000000">=</span><span style="color: #000000">D:\eclipse\MyEclipse&nbsp;</span><span style="color: #000000">6.0</span><span style="color: #000000">.1GA\eclipse\MyEclipseSplash.bmp<br />
</span><span style="color: #000000">-</span><span style="color: #000000">Duser.language</span><span style="color: #000000">=</span><span style="color: #000000">en&nbsp;<br />
</span><span style="color: #000000">-</span><span style="color: #000000">XX:PermSize</span><span style="color: #000000">=</span><span style="color: #000000">128M&nbsp;<br />
</span><span style="color: #000000">-</span><span style="color: #000000">XX:MaxPermSize</span><span style="color: #000000">=</span><span style="color: #000000">256M</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实这个文件为空都没关系，大象试过，全部删除，没有错误，不过我还是建议大家里面至少保留这些东东<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: #000000">-</span><span style="color: #000000">vmargs<br />
</span><span style="color: #000000">-</span><span style="color: #000000">Xms256m<br />
</span><span style="color: #000000">-</span><span style="color: #000000">Xmx512m</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我将128改成了256，如果你想在MyEclipse插件中用"MyEclipse 6.0.1"快捷方式来启动的话，可以写成这样<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: #000000">-</span><span style="color: #000000">vmargs<br />
</span><span style="color: #000000">-</span><span style="color: #000000">Xms256m<br />
</span><span style="color: #000000">-</span><span style="color: #000000">Xmx512m<br />
</span><span style="color: #000000">-</span><span style="color: #000000">Dosgi.splashLocation</span><span style="color: #000000">=</span><span style="color: #000000">D:\Eclipse</span><span style="color: #000000">-</span><span style="color: #000000">3.3</span><span style="color: #000000">.</span><span style="color: #000000">1</span><span style="color: #000000">\ThirdPlugins\MyEclipse&nbsp;</span><span style="color: #000000">6.0</span><span style="color: #000000">.1GA\eclipse\MyEclipseSplash.bmp</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最下面一行是启动时，显示MyEclipse的图片，如果没有这句话运行"MyEclipse 6.0.1"快捷方式，则会显示eclipse的启动画面，其实"MyEclipse 6.0.1"快捷方式还是连接着eclipse.exe这个执行程序，在"MyEclipse 6.0.1"上点右键，选择属性，在目标里就可以看到。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff"><strong>第6步：注册MyEclipse<br />
</strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyEclipse6.0的注册一定要断开网络，否则肯定不成功！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">6.0.1GA注册码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subscriber: administrator<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subscription Code: nLR7ZL-655342-54657656405281154<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">这里有一点大象要提醒大家注意，如果你电脑上现在正有使用的MyEclipse，就是说已经注册了，那么在C:\Documents and Settings\"自己的用户名" 目录下，会有一个".myeclipse.properties"文件，这时请先备份此文件，然后删除它，断开网络，再来注册MyEclipse6.0.1，成功后如下：<br />
<img height="410" alt="" hspace="2" src="http://www.blogjava.net/images/blogjava_net/bolo/eclipse/7.JPG" width="523" vspace="5" border="0" /><br />
<img height="277" alt="" hspace="2" src="http://www.blogjava.net/images/blogjava_net/bolo/eclipse/6.JPG" width="720" vspace="5" border="0" /></span></span></span></span></p>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff"><strong>第7步：打包eclipse<br />
</strong><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到现在所有的工作都已经完成，启动eclipse的速度快不快？好了，该做最后一步操作了，将"<font face="宋体" size="2">configuration"文件夹下的内容除"<font face="宋体" size="2">config.ini</font>"文件外全部删除，另外再把workspace文件夹删除，大象一般会把workspace放在eclipse根目录下，方法是在第一次启动选择路径时把前面的目录都删除，只保留workspace（前面什么都不要保留）。这样方便管理，你要放在其它的地方随便，这个看各人喜好。做完这两步之后，最好还是在eclipse目录下建一个txt文本文件，把上面的注册码放到里面，另外加上一句话:"<font face="宋体" size="2">注册时一定要断开网络,否则肯定注册不成功!</font>"这样以后用时，可以提醒自己一下。里面有注册码，要用时很方便。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在eclipse文件夹上点右键，选择"添加到eclipse.rar"，等到压缩完成，至此，终于大功告成！<br />
&nbsp;&nbsp;&nbsp;&nbsp;大家尽管放心按着我的方法试，大象前前后后做了不下十遍，今天又在公司的电脑上做了一遍，图片都是刚刚截取的，嘿嘿，今天老板不在，大象小小的放松一下，写写博客。有了这个压缩包，以后大家在使用时就会方便很多，特别是保存到移动硬盘里，想在哪用就在哪用。哇哈哈哈哈~~~~~~~~祝大家好运，都成功做出来！<br />
&nbsp;&nbsp;&nbsp;&nbsp;此帖为菠萝大象原创，如要转载请注明出处。</font></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> 
<img src ="http://www.blogjava.net/forgood/aggbug/220783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2008-08-07 23:00 <a href="http://www.blogjava.net/forgood/archive/2008/08/07/220783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中使用oracle的exp/imp导出、导入数据</title><link>http://www.blogjava.net/forgood/archive/2008/06/13/207623.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Fri, 13 Jun 2008 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/forgood/archive/2008/06/13/207623.html</guid><wfw:comment>http://www.blogjava.net/forgood/comments/207623.html</wfw:comment><comments>http://www.blogjava.net/forgood/archive/2008/06/13/207623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/forgood/comments/commentRss/207623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/forgood/services/trackbacks/207623.html</trackback:ping><description><![CDATA[<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天在学习的过程中遇到了一篇关于java中使用oracle导入导出的文章，感觉还不错，为了学习和以后工作的需要，我整理如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[]&nbsp;cmds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[</span><span style="color: #000000">3</span><span style="color: #000000">];<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmds[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">cmd</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmds[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/C</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmds[</span><span style="color: #000000">2</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">commandBuf.toString();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process&nbsp;process</span><span style="color: #000000">=</span><span style="color: #000000">Runtime.getRuntime().exec(cmds);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;shouldClose</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_187_459_Open_Image" onclick="this.style.display='none'; Codehighlighter1_187_459_Open_Text.style.display='none'; Codehighlighter1_187_459_Closed_Image.style.display='inline'; Codehighlighter1_187_459_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_187_459_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_187_459_Closed_Text.style.display='none'; Codehighlighter1_187_459_Open_Image.style.display='inline'; Codehighlighter1_187_459_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_187_459_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_187_459_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamReader&nbsp;isr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InputStreamReader(process.getErrorStream());<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedReader(isr);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_377_455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_455_Open_Text.style.display='none'; Codehighlighter1_377_455_Closed_Image.style.display='inline'; Codehighlighter1_377_455_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_377_455_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_377_455_Closed_Text.style.display='none'; Codehighlighter1_377_455_Open_Image.style.display='inline'; Codehighlighter1_377_455_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((line&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;br.readLine())&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_377_455_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_377_455_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_409_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_409_450_Open_Text.style.display='none'; Codehighlighter1_409_450_Closed_Image.style.display='inline'; Codehighlighter1_409_450_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_409_450_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_409_450_Closed_Text.style.display='none'; Codehighlighter1_409_450_Open_Image.style.display='inline'; Codehighlighter1_409_450_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(line.indexOf(</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">1</span><span style="color: #000000">)</span><span id="Codehighlighter1_409_450_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_409_450_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shouldClose</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_488_513_Open_Image" onclick="this.style.display='none'; Codehighlighter1_488_513_Open_Text.style.display='none'; Codehighlighter1_488_513_Closed_Image.style.display='inline'; Codehighlighter1_488_513_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_488_513_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_488_513_Closed_Text.style.display='none'; Codehighlighter1_488_513_Open_Image.style.display='inline'; Codehighlighter1_488_513_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IOException&nbsp;ioe)&nbsp;</span><span id="Codehighlighter1_488_513_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_488_513_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shouldClose</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(shouldClose)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process.destroy();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;exitVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;process.waitFor();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面还有一种形式：<br />
exp和imp的输出是要从ErrorStream中获取，这是我以前写的 <br />
Process proc = null; <br />
try <br />
{ <br />
proc = Runtime.getRuntime().exec(cmd.toString()); <br />
InputStream istr = proc.getErrorStream(); <br />
BufferedReader br = new BufferedReader(new InputStreamReader(istr)); <br />
String str; <br />
while ((str=br.readLine()) != null) <br />
{ <br />
errorInfo.append(str + "\n"); <br />
} <br />
proc.waitFor(); <br />
} <br />
catch (Exception e) <br />
{ <br />
... <br />
} <br />
if (proc.exitValue() == 0) <br />
{ <br />
proc.destroy(); <br />
return true; <br />
} <br />
else <br />
{ <br />
if(logger.isDebugEnabled()) <br />
logger.debug(errorInfo); <br />
proc.destroy(); <br />
return false; <br />
}&nbsp;<br />
两者可以比较的看看<br />
注意：在执行oracle的exp时，出现了一个很怪的现象，就是exp在console输出的信息没有被放入InputStream，反而是放到了ErrorStream中(即使正确的情况也是)，这就导致了按照正常的情况去写这段代码的话反而会出问题。---这是在jdk1.4环境下实现的。<br />
<br />
<br />
<br />
还有中建议是在jdk1.5环境下：可以如下实现<br />
1，把对InputStream的处理放到一个单独Thread里面。 <br />
2，用ProcessBuilder的redirectErrorStream来合并OutputStream和ErrorStream。注意子进程的InputStream对应父进程的OutStream。如果不合并这两个流的话则必须并行排空它们，顺序的排空会导致思索。 <br />
</span>
<img src ="http://www.blogjava.net/forgood/aggbug/207623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/forgood/" target="_blank">forgood</a> 2008-06-13 11:57 <a href="http://www.blogjava.net/forgood/archive/2008/06/13/207623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>