﻿<?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-BaoYaEr-文章分类-java</title><link>http://www.blogjava.net/baoyaer/category/17558.html</link><description>java</description><language>zh-cn</language><lastBuildDate>Mon, 25 Jul 2011 16:38:52 GMT</lastBuildDate><pubDate>Mon, 25 Jul 2011 16:38:52 GMT</pubDate><ttl>60</ttl><item><title>mule事件驱动服务</title><link>http://www.blogjava.net/baoyaer/articles/354997.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 25 Jul 2011 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/354997.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/354997.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/354997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/354997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/354997.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: @import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);面向服务的架构和事件驱动的架构天生就有着对分布式系统的适应性，这些架构都有着模块性、松散耦合，和适应性等特...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/354997.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/354997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2011-07-25 16:17 <a href="http://www.blogjava.net/baoyaer/articles/354997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介</title><link>http://www.blogjava.net/baoyaer/articles/354810.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 21 Jul 2011 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/354810.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/354810.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/354810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/354810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/354810.html</trackback:ping><description><![CDATA[@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
<h3>
<div><span style="font-weight: normal; ">在多线程大师Doug Lea的贡献下，在JDK1.5中加入了许多对并发特性的支持，例如：线程池。<br />
一、简介
<div>线程池类为 java.util.concurrent.ThreadPoolExecutor，常用构造方法为：<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">ThreadPoolExecutor(<span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;corePoolSize,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;maximumPoolSize,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;keepAliveTime,&nbsp;TimeUnit&nbsp;unit,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BlockingQueue&nbsp;workQueue,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RejectedExecutionHandler&nbsp;handler)</span></span></div>
</div>
<br />
</span></div>
&nbsp;&nbsp; &nbsp;<span style="font-size: 14px; font-weight: normal; ">corePoolSize： &nbsp; 线程池维护线程的最少数量， &nbsp;&nbsp;<br />
</span><span style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;maximumPoolSize：线程池维护线程的最大数量<br />
</span><span style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;keepAliveTime： &nbsp;线程池维护线程所允许的空闲时间<br />
</span><span style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;unit： &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 线程池维护线程所允许的空闲时间的单位<br />
</span><span style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;workQueue： &nbsp; &nbsp; &nbsp;线程池所使用的缓冲队列<br />
</span><span style="font-size: 14px; font-weight: normal;">&nbsp;&nbsp; &nbsp;handler： &nbsp; &nbsp; &nbsp; &nbsp;线程池对拒绝任务的处理策略</span><br />
<br />
<br />
<span style="font-size: 14px; font-weight: normal;">&nbsp;&nbsp; 一个任务通过 execute(Runnable)方法被添加到线程池，任务就是一个 Runnable类型的对象，任务的执行方法就是 Runnable类型对象的run()方法。</span>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;当一个任务通过execute(Runnable)方法欲添加到线程池时：</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;如果此时线程池中的数量小于corePoolSize，即使线程池中的线程都处于空闲状态，也要创建新的线程来处理被添加的任务。</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;如果此时线程池中的数量等于 corePoolSize，但是缓冲队列 workQueue未满，那么任务被放入缓冲队列。</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;如果此时线程池中的数量大于corePoolSize，缓冲队列workQueue满，并且线程池中的数量小于maximumPoolSize，建新的线程来处理被添加的任务。</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;如果此时线程池中的数量大于corePoolSize，缓冲队列workQueue满，并且线程池中的数量等于maximumPoolSize，那么通过 handler所指定的策略来处理此任务。&nbsp;</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;也就是：处理任务的优先级为：</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize，如果三者都满了，使用handler处理被拒绝的任务。</div>
<div><span style="font-size: 14px; font-weight: normal;">&nbsp;&nbsp; &nbsp;当线程池中的线程数量大于 corePoolSize时，如果某线程空闲时间超过keepAliveTime，线程将被终止。这样，线程池可以动态的调整池中的线程数。</span><br />
<br />
<span style="font-size: 14px; font-weight: normal;">&nbsp;&nbsp; &nbsp;unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性：</span>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。<br />
<br />
&nbsp;&nbsp; &nbsp;workQueue我常用的是：java.util.concurrent.ArrayBlockingQueue</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;handler有四个选择：</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;ThreadPoolExecutor.AbortPolicy() &nbsp; &nbsp; &nbsp; &nbsp;</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp; &nbsp; 抛出java.util.concurrent.RejectedExecutionException异常</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;ThreadPoolExecutor.CallerRunsPolicy() &nbsp;&nbsp;</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp; &nbsp; 重试添加当前的任务，他会自动重复调用execute()方法</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;ThreadPoolExecutor.DiscardOldestPolicy()</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp; &nbsp; 抛弃旧的任务</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp;ThreadPoolExecutor.DiscardPolicy() &nbsp; &nbsp; &nbsp;</div>
<div style="font-size: 14px; font-weight: normal; ">&nbsp;&nbsp; &nbsp; &nbsp; 抛弃当前的任务<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.Serializable;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ArrayBlockingQueue;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.ThreadPoolExecutor;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.concurrent.TimeUnit;<br />
<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;TestThreadPool&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;produceTaskSleepTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;consumeTaskSleepTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2000</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;produceTaskMaxNumber&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">构造一个线程池&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadPoolExecutor&nbsp;threadPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ThreadPoolExecutor(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeUnit.SECONDS,&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayBlockingQueue(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ThreadPoolExecutor.DiscardOldestPolicy());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">produceTaskMaxNumber;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&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;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">产生一个任务，并将其加入到线程池</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;task&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">task@&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">put&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;task);<br />
&nbsp;&nbsp;&nbsp;&nbsp;threadPool.execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ThreadPoolTask(task));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">便于观察，等待一段时间</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(produceTaskSleepTime);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;}<br />
<br />
&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;&nbsp;*&nbsp;线程池执行的任务<br />
&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;hdpan<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ThreadPoolTask&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable,Serializable{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">保存任务所需要的数据</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;Object&nbsp;threadPoolTaskData;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadPoolTask(Object&nbsp;tasks){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.threadPoolTaskData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tasks;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">处理一个任务，这里的处理方式太简单了，仅仅是一个打印语句</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">start&nbsp;..</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">threadPoolTaskData);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">////</span><span style="color: #008000; ">便于观察，等待一段时间</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(consumeTaskSleepTime);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<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;threadPoolTaskData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Object&nbsp;getTask(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.threadPoolTaskData;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
</div>
<span style="font-weight: normal;">说明：</span></div>
<div><span style="font-weight: normal;">1、在这段程序中，一个任务就是一个Runnable类型的对象，也就是一个ThreadPoolTask类型的对象。</span></div>
<div><span style="font-weight: normal;">2、一般来说任务除了处理方式外，还需要处理的数据，处理的数据通过构造方法传给任务。</span></div>
<div><span style="font-weight: normal;">3、在这段程序中，main()方法相当于一个残忍的领导，他派发出许多任务，丢给一个叫 threadPool的任劳任怨的小组来做。</span></div>
<div><span style="font-weight: normal;">&nbsp;&nbsp; &nbsp;这个小组里面队员至少有两个，如果他们两个忙不过来， 任务就被放到任务列表里面。</span></div>
<div><span style="font-weight: normal;">&nbsp;&nbsp; &nbsp;如果积压的任务过多，多到任务列表都装不下(超过3个)的时候，就雇佣新的队员来帮忙。但是基于成本的考虑，不能雇佣太多的队员， 至多只能雇佣 4个。</span></div>
<div><span style="font-weight: normal;">&nbsp;&nbsp; &nbsp;如果四个队员都在忙时，再有新的任务， 这个小组就处理不了了，任务就会被通过一种策略来处理，我们的处理方式是不停的派发， 直到接受这个任务为止(更残忍！呵呵)。</span></div>
<div><span style="font-weight: normal;">&nbsp;&nbsp; &nbsp;因为队员工作是需要成本的，如果工作很闲，闲到 3SECONDS都没有新的任务了，那么有的队员就会被解雇了，但是，为了小组的正常运转，即使工作再闲，小组的队员也不能少于两个。</span></div>
<div><span style="font-weight: normal; "><br />
</span></div>
<div><span style="font-weight: normal;">4、通过调整 produceTaskSleepTime和 consumeTaskSleepTime的大小来实现对派发任务和处理任务的速度的控制， 改变这两个值就可以观察不同速率下程序的工作情况。</span></div>
<div><span style="font-weight: normal;">5、通过调整4中所指的数据，再加上调整任务丢弃策略， 换上其他三种策略，就可以看出不同策略下的不同处理方式。</span></div>
<div><span  style="font-weight: normal;">6、对于其他的使用方法，参看jdk的帮助，很容易理解和使用。</span><br />
<br />
<span  style="font-weight: normal;">发邮件示例：</span><br />
<span style="font-weight: normal; ">在普通的web应用中，发送邮件应该只能算小任务，而使用jms来发送邮件有点杀鸡用牛刀的味道，那么如果能建立一个线程池来管理这些小线程并重复使用他们，应该来说是一个简单有效的方案，我们可以使用concurrent包中的Executors来建立线程池，Executors是一个工厂，也是一个工具类，我把它的api的介绍简单的翻译了一下（如果翻译有误请大家不要吝啬手中的砖头）</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; font-weight: normal; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;*&nbsp;由spring管理的线程池类，返回的ExecutorService就是给我们来执行线程的&nbsp;<br />
*如果不交给spring管理也是可以的，可以使用单例模式来实现同样功能，但是poolSize&nbsp;&nbsp;&nbsp;*要hardcode了&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;张荣华(ahuaxuan)&nbsp;<br />
*&nbsp;</span><span style="color: #808080; ">@version</span><span style="color: #008000; ">&nbsp;$Id$&nbsp;<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;EasyMailExecutorPool&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;InitializingBean&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">线程池大小，spring配置文件中配置&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;poolSize;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;service;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;ExecutorService&nbsp;getService()&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;service;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;getPoolSize()&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;poolSize;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setPoolSize(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;poolSize)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.poolSize&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;poolSize;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;在&nbsp;bean&nbsp;被初始化成功之后初始化线程池大小&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;afterPropertiesSet()&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;Exception&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;service&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Executors.newFixedThreadPool(poolSize);&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
} &nbsp;</span></div>
<br />
<span style="font-weight: normal; ">这样我们就初始化了线程池的大小，接下来就是如何使用这个线程池中的线程了，我们看看MailService是如何来使用线程池中的线程的，这个类中的代码我已经作了详细的解释&nbsp;
<div>代码<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;*&nbsp;用来发送&nbsp;mail&nbsp;的&nbsp;service,&nbsp;其中有一个内部类专门用来供线程使用&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;张荣华(ahuaxuan)&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@since</span><span style="color: #008000; ">&nbsp;2007-7-11&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@version</span><span style="color: #008000; ">&nbsp;$Id$&nbsp;<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;EasyMailServieImpl&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;EasyMailService{&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">transient</span><span style="color: #000000; ">&nbsp;Log&nbsp;logger&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;LogFactory.getLog(EasyMailServieImpl.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">注入MailSender&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;JavaMailSender&nbsp;javaMailSender;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">注入线程池&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;EasyMailExecutorPool&nbsp;easyMailExecutorPool;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">设置发件人&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;from;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setEasyMailExecutorPool(EasyMailExecutorPool&nbsp;easyMailExecutorPool)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.easyMailExecutorPool&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;easyMailExecutorPool;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setJavaMailSender(JavaMailSender&nbsp;javaMailSender)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.javaMailSender&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;javaMailSender;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setFrom(String&nbsp;from)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.from&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;from;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;简单的邮件发送接口，感兴趣的同学可以在这个基础上继续添加&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;to&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;subject&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;text&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;sendMessage(EmailEntity&nbsp;email){&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;email)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(logger.isDebugEnabled())&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">something&nbsp;you&nbsp;need&nbsp;to&nbsp;tell&nbsp;here</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;SimpleMailMessage&nbsp;simpleMailMessage&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SimpleMailMessage();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;simpleMailMessage.setTo(email.getTo());&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;simpleMailMessage.setSubject(email.getSubject());&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;simpleMailMessage.setText(email.getText());&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;simpleMailMessage.setFrom(from);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;easyMailExecutorPool.getService().execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;MailRunner(simpleMailMessage));&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;发送复杂格式邮件的接口，可以添加附件，图片，等等，但是需要修改这个方法，&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;如何做到添加附件和图片论坛上有例子了，需要的同学搜一下,&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;事实上这里的text参数最好是来自于模板，用模板生成html页面，然后交给javamail去发送，&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;如何使用模板来生成html见&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.iteye.com/topic/71430</span><span style="color: #008000; ">&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;to&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;subject&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;text&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;MessagingException&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;sendMimeMessage(EmailEntity&nbsp;email)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;MessagingException&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;email)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(logger.isDebugEnabled())&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">something&nbsp;you&nbsp;need&nbsp;to&nbsp;tell&nbsp;here</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;MimeMessage&nbsp;message&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;javaMailSender.createMimeMessage();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;MimeMessageHelper&nbsp;helper&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;MimeMessageHelper(message);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;helper.setTo(email.getTo());&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;helper.setFrom(from);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;helper.setSubject(email.getSubject());&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.addAttachmentOrImg(helper,&nbsp;email.getAttachment(),&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.addAttachmentOrImg(helper,&nbsp;email.getImg(),&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">这里的text是html格式的,&nbsp;可以使用模板引擎来生成html模板,&nbsp;velocity或者freemarker都可以做到&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;helper.setText(email.getText(),</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;easyMailExecutorPool.getService().execute(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;MailRunner(message));&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;添加附件或者是图片&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;helper&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;map&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;isAttachment&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;MessagingException&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;addAttachmentOrImg(MimeMessageHelper&nbsp;helper,&nbsp;Map&nbsp;map,&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;isAttachment)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;MessagingException&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Iterator&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;map.entrySet().iterator();&nbsp;it.hasNext();)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map.Entry&nbsp;entry&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Map.Entry)&nbsp;it.next();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(String)&nbsp;entry.getKey();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(String)&nbsp;entry.getValue();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(StringUtils.isNotBlank(key)&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;StringUtils.isNotBlank(value))&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileSystemResource&nbsp;file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileSystemResource(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(value));&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">file.exists())&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(isAttachment)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helper.addAttachment(key,&nbsp;file);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helper.addInline(key,&nbsp;file);&nbsp;&nbsp;<br />
&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;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;用来发送邮件的&nbsp;Runnable,&nbsp;该类是一个内部类，之所以使用内部类，而没有使用嵌套类（静态内部类），&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;是因为内部类可以之间得到&nbsp;service&nbsp;的&nbsp;javaMailSender&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;每次发送邮件都会从线程池中取一个线程,&nbsp;然后进行发邮件操作&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;ahuaxuan&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;MailRunner&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Runnable&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;SimpleMailMessage&nbsp;simpleMailMessage;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;MimeMessage&nbsp;mimeMessage;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构造简单文本邮件&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;simpleMailMessage&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;MailRunner(SimpleMailMessage&nbsp;simpleMailMessage)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(mimeMessage&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.simpleMailMessage&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;simpleMailMessage;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构造复杂邮件，可以添加附近，图片，等等&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;mimeMessage&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;MailRunner(MimeMessage&nbsp;mimeMessage)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(simpleMailMessage&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.mimeMessage&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;mimeMessage;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;该方法将在线程池中的线程中执行&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(simpleMailMessage&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javaMailSender.send(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.simpleMailMessage);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(mimeMessage&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javaMailSender.send(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.mimeMessage);&nbsp;&nbsp;<br />
&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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;<br />
&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; ">&nbsp;(logger.isDebugEnabled())&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">logger&nbsp;something&nbsp;here</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;e);&nbsp;&nbsp;<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;<br />
} &nbsp;</span></div>
</div>
</span><br />
<span  style="font-weight: normal;">MailService中的EmailEntity是对邮件的抽象(我只使用了失血模型，事实上我们也可以让这个EmailEntity来实现Runnable接口，这样Service中的内部类就可以去掉了，同时service中的大部分代码就要搬到EmailEntity及其父类里了，大家更倾向于怎么做呢？)，代码如下:&nbsp;</span></div>
<div><span  style="font-weight: normal; ">代码<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />
&nbsp;*&nbsp;该类是对邮件的抽象，邮件有哪些属性，这个类就有哪些属性&nbsp;显然这个只是一个例子，&nbsp;<br />
&nbsp;*&nbsp;这个例子中附带mimemessage发送所需的附件或者图片（如果有的话）&nbsp;<br />
&nbsp;*&nbsp;需要使用的同学自己扩展&nbsp;<br />
&nbsp;*&nbsp;&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;张荣华(ahuaxuan)&nbsp;<br />
*&nbsp;</span><span style="color: #808080; ">@version</span><span style="color: #008000; ">&nbsp;$Id$&nbsp;<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">&nbsp;&nbsp;<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;EmailEntity&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String&nbsp;to;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String&nbsp;subject;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String&nbsp;text;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">邮件附件&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;Map &nbsp;</span></div>
<br />
</span></div>
<br />
</h3>
<img src ="http://www.blogjava.net/baoyaer/aggbug/354810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2011-07-21 17:22 <a href="http://www.blogjava.net/baoyaer/articles/354810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在xml的汪洋中遨游之mule篇</title><link>http://www.blogjava.net/baoyaer/articles/353499.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 01 Jul 2011 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/353499.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/353499.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/353499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/353499.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/353499.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: mule号称开源ESB的最好实现，研究mule也有段时间了， 在&#8220;浩如烟海&#8221;的xml配置中，保持清醒的头脑确实不容易。&nbsp;作为学习笔记之一，记录一下一个mule简单应用的实现。需求：给指定的email地址发送邮件.&nbsp;一：基本实现：&nbsp;1: 实现命令行输入发送email：&nbsp;为了能在命令行接受输入， 需要配置一个输入输出连...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/353499.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/353499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2011-07-01 11:52 <a href="http://www.blogjava.net/baoyaer/articles/353499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下java运行脚本</title><link>http://www.blogjava.net/baoyaer/articles/313887.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 25 Feb 2010 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/313887.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/313887.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/313887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/313887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/313887.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">/</span><span style="color: #000000">home</span><span style="color: #000000">/</span><span style="color: #000000">guest</span><span style="color: #000000">/</span><span style="color: #000000">java6</span><span style="color: #000000">/</span><span style="color: #000000">jdk1.</span><span style="color: #000000">6</span><span style="color: #000000">.0_14</span><span style="color: #000000">/</span><span style="color: #000000">bin</span><span style="color: #000000">/</span><span style="color: #000000">java&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">Xms10M&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">Xmx10M&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">Djava.ext.dirs</span><span style="color: #000000">=</span><span style="color: #000000">..</span><span style="color: #000000">/</span><span style="color: #000000">lib</span><span style="color: #000000">/</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">Dlog4j.configuration</span><span style="color: #000000">=</span><span style="color: #000000">.</span><span style="color: #000000">/</span><span style="color: #000000">conf</span><span style="color: #000000">/</span><span style="color: #000000">log4j.properties&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />cn.cnnic.regstat.Main&nbsp;</span><span style="color: #000000">&amp;</span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/313887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2010-02-25 14:39 <a href="http://www.blogjava.net/baoyaer/articles/313887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出之正则表达式【zt】</title><link>http://www.blogjava.net/baoyaer/articles/298515.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 16 Oct 2009 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/298515.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/298515.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/298515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/298515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/298515.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 深入浅出之正则表达式（一）前言：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;半年前我对正则表达式产生了兴趣，在网上查找过不少资料，看过不少的教程，最后在使用一个正则表达式工具RegexBuddy时发现他的教程写的非常好，可以说是我目前见过最好的正则表达式教程。于是一直想把他翻译过来。这个愿望直到这个五一长假才得以实现，结果就有了这篇文章。关于...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/298515.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/298515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2009-10-16 10:43 <a href="http://www.blogjava.net/baoyaer/articles/298515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaClassLoader与Package机制</title><link>http://www.blogjava.net/baoyaer/articles/254245.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 11 Feb 2009 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/254245.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/254245.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/254245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/254245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/254245.html</trackback:ping><description><![CDATA[为了深入了解Java的ClassLoader机制，我们先来做以下实验：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;java.lang;<br />
<img id="Codehighlighter1_37_159_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_159_Open_Text.style.display='none'; Codehighlighter1_37_159_Closed_Image.style.display='inline'; Codehighlighter1_37_159_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_37_159_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_159_Closed_Text.style.display='none'; Codehighlighter1_37_159_Open_Image.style.display='inline'; Codehighlighter1_37_159_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span id="Codehighlighter1_37_159_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_37_159_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_79_157_Open_Image" onclick="this.style.display='none'; Codehighlighter1_79_157_Open_Text.style.display='none'; Codehighlighter1_79_157_Closed_Image.style.display='inline'; Codehighlighter1_79_157_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_79_157_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_79_157_Closed_Text.style.display='none'; Codehighlighter1_79_157_Open_Image.style.display='inline'; Codehighlighter1_79_157_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_79_157_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_79_157_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">char</span><span style="color: #000000">[]&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">1234567890</span><span style="color: #000000">"</span><span style="color: #000000">.toCharArray();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　String&nbsp;s&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">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">,&nbsp;c);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
String类有一个Package权限的构造函数String(int offset, int length, char[] array)，按照默认的访问权限，由于Test属于java.lang包，因此理论上应该可以访问String的这个构造函数。编译通过！执行时结果如下：<br />
　　Exception in thread "main" java.lang.SecurityException: Prohibited package name:<br />
　　java.lang<br />
　　 at java.lang.ClassLoader.defineClass(Unknown Source)<br />
　　 at java.security.SecureClassLoader.defineClass(Unknown Source)<br />
　　 at java.net.URLClassLoader.defineClass(Unknown Source)<br />
　　 at java.net.URLClassLoader.Access$100(Unknown Source)<br />
　　 at java.net.URLClassLoader$1.run(Unknown Source)<br />
　　 at java.security.AccessController.doPrivileged(Native Method)<br />
　　 at java.net.URLClassLoader.findClass(Unknown Source)<br />
　　 at java.lang.ClassLoader.loadClass(Unknown Source)<br />
　　 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)<br />
　　 at java.lang.ClassLoader.loadClass(Unknown Source)<br />
　　 at java.lang.ClassLoader.loadClassInternal(Unknown Source)<br />
　　希奇吧？要弄清为什么会有SecurityException，就必须搞清楚ClassLoader的机制。<br />
<br />
Java的ClassLoader就是用来动态装载class的，ClassLoader对一个class只会装载一次，JVM使用的ClassLoader一共有4种：<br />
　　启动类装载器，标准扩展类装载器，类路径装载器和网络类装载器。<br />
　　这4种ClassLoader的优先级依次从高到低，使用所谓的&#8220;双亲委派模型&#8221;。确切地说，假如一个网络类装载器被请求装载一个java.lang.Integer，它会首先把请求发送给上一级的类路径装载器，假如返回已装载，则网络类装载器将不会装载这个java.lang.Integer，假如上一级的类路径装载器返回未装载，它才会装载java.lang.Integer。<br />
　　类似的，类路径装载器收到请求后（无论是直接请求装载还是下一级的ClassLoader上传的请求），它也会先把请求发送到上一级的标准扩展类装载器，这样一层一层上传，于是启动类装载器优先级最高，假如它按照自己的方式找到了java.lang.Integer，则下面的ClassLoader 都不能再装载java.lang.Integer，尽管你自己写了一个java.lang.Integer，试图取代核心库的java.lang.Integer是不可能的，因为自己写的这个类根本无法被下层的ClassLoader装载。<br />
　　 <br />
　　 再说说Package权限。Java语言规定，在同一个包中的class，假如没有修饰符，默认为Package权限，包内的class都可以访问。但是这还不够准确。确切的说，只有由同一个ClassLoader装载的class才具有以上的Package权限。比如启动类装载器装载了java.lang.String，类路径装载器装载了我们自己写的java.lang.Test，它们不能互相访问对方具有Package权限的方法。这样就阻止了恶意代码访问核心类的Package权限方法。
<img src ="http://www.blogjava.net/baoyaer/aggbug/254245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2009-02-11 14:10 <a href="http://www.blogjava.net/baoyaer/articles/254245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JTA事务初级研究</title><link>http://www.blogjava.net/baoyaer/articles/248196.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 25 Dec 2008 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/248196.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/248196.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/248196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/248196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/248196.html</trackback:ping><description><![CDATA[一般情况下，J2EE应用服务器支持JDBC事务、JTA事务、容器管理事务。这里讨论JTA和JDBC事务的区别。这2个是常用的DAO模式事务界定方式。<br />
&nbsp;<strong>JDBC 事务<br />
</strong>&nbsp;JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式：自动提交和手工提交。<br />
★ 在jdbc中，事务操作缺省是自动提交。也就是说，一条对数据库的更新表达式代表一项事务操作，操作成功后，系统将自动调用commit()来提交，否则将调用rollback()来回滚。<br />
★&nbsp; 在jdbc中，可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务，在操作完成后调 用commit()来进行整体提交，倘若其中一个表达式操作失败，都不会执行到commit()，并且将产生响应的异常；此时就可以在异常捕获时调用 rollback()进行回滚。这样做可以保持多次更新操作后，相关数据的一致性，示例如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_4_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_259_Open_Text.style.display='none'; Codehighlighter1_4_259_Closed_Image.style.display='inline'; Codehighlighter1_4_259_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_4_259_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4_259_Closed_Text.style.display='none'; Codehighlighter1_4_259_Open_Image.style.display='inline'; Codehighlighter1_4_259_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_4_259_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_4_259_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DriverManager.getConnection&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;conn.setAutoCommit(</span><span style="color: #0000ff">false</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">禁止自动提交，设置回滚点</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;stmt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.createStatement();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;stmt.executeUpdate(&#8220;alter&nbsp;table&nbsp;&#8230;&#8221;);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">数据库更新操作1</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;stmt.executeUpdate(&#8220;insert&nbsp;into&nbsp;table&nbsp;&#8230;&#8221;);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">数据库更新操作2</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;conn.commit();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">事务提交</span><span style="color: #008000"><br />
<img id="Codehighlighter1_280_412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_280_412_Open_Text.style.display='none'; Codehighlighter1_280_412_Closed_Image.style.display='inline'; Codehighlighter1_280_412_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_280_412_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_280_412_Closed_Text.style.display='none'; Codehighlighter1_280_412_Open_Image.style.display='inline'; Codehighlighter1_280_412_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_280_412_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_280_412_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
<img id="Codehighlighter1_318_357_Open_Image" onclick="this.style.display='none'; Codehighlighter1_318_357_Open_Text.style.display='none'; Codehighlighter1_318_357_Closed_Image.style.display='inline'; Codehighlighter1_318_357_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_318_357_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_318_357_Closed_Text.style.display='none'; Codehighlighter1_318_357_Open_Image.style.display='inline'; Codehighlighter1_318_357_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_318_357_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_318_357_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;conn.rollback();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">操作不成功则回滚</span><span style="color: #008000"><br />
<img id="Codehighlighter1_377_410_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_410_Open_Text.style.display='none'; Codehighlighter1_377_410_Closed_Image.style.display='inline'; Codehighlighter1_377_410_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_377_410_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_377_410_Closed_Text.style.display='none'; Codehighlighter1_377_410_Open_Image.style.display='inline'; Codehighlighter1_377_410_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_377_410_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_410_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;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。<br />
<br />
<strong>&nbsp;JTA事务</strong><br />
&nbsp;JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。<br />
&nbsp;要用 JTA 进行事务界定，应用程序要调用 javax.transaction.UserTransaction 接口中的方法。例如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utx.begin();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;obtainXADataSource();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ds.getConnection();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstmt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.prepareStatement(</span><span style="color: #000000">"</span><span style="color: #000000">UPDATE&nbsp;MOVIES&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></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;pstmt.setString(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Spinal&nbsp;Tap</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;pstmt.executeUpdate();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utx.commit();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
&#8220;用 JTA 界定事务，那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。&#8221;<br />
&nbsp;要使用JTA事务，必须使用XADataSource来产生数据库连接，产生的连接为一个XA连接。<br />
&nbsp;XA连接（javax.sql.XAConnection）和非XA（java.sql.Connection）连接的区别在于：XA可以参与JTA的事务，而且不支持自动提交。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;Note:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Oracle,&nbsp;Sybase,&nbsp;DB2,&nbsp;SQL&nbsp;Server等大型数据库才支持XA,&nbsp;支持分布事务。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />My&nbsp;SQL&nbsp;连本地都支持不好，更别说分布事务了。</span></div>
<br />
JTA方式的实现过程：<br />
&nbsp;&nbsp; 用XADataSource产生的XAConnection它扩展了一个getXAResource()方法,事务通过这个方法把它加入到事务容器中进行 管理.对于调用者来说,根本看不到事务是如果管理的,你只要声明开始事务,告诉容器我下面的操作要求事务参与了,最后告诉事务说到这儿可以提交或回滚了, 别的都是黑箱操作。<br />
&nbsp;在使用JTA之前，你必须首先实现一个Xid类用来标识事务（在普通情况下这将由事务管理程序来处理）。Xid包含三个元素：formatID、gtrid（全局事务标识符）和bqual（分支修饰词标识符）。<br />
&nbsp;下面的例子说明Xid的实现：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.transaction.xa.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;<br />
<img id="Codehighlighter1_66_523_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_523_Open_Text.style.display='none'; Codehighlighter1_66_523_Closed_Image.style.display='inline'; Codehighlighter1_66_523_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_66_523_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_66_523_Closed_Text.style.display='none'; Codehighlighter1_66_523_Open_Image.style.display='inline'; Codehighlighter1_66_523_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyXid&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Xid&nbsp;</span><span id="Codehighlighter1_66_523_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_66_523_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;formatId;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;gtrid[];&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;bqual[];&nbsp;<br />
<img id="Codehighlighter1_171_177_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_177_Open_Text.style.display='none'; Codehighlighter1_171_177_Closed_Image.style.display='inline'; Codehighlighter1_171_177_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_171_177_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_171_177_Closed_Text.style.display='none'; Codehighlighter1_171_177_Open_Image.style.display='inline'; Codehighlighter1_171_177_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MyXid()&nbsp;</span><span id="Codehighlighter1_171_177_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_171_177_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_238_325_Open_Image" onclick="this.style.display='none'; Codehighlighter1_238_325_Open_Text.style.display='none'; Codehighlighter1_238_325_Closed_Image.style.display='inline'; Codehighlighter1_238_325_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_238_325_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_238_325_Closed_Text.style.display='none'; Codehighlighter1_238_325_Open_Image.style.display='inline'; Codehighlighter1_238_325_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MyXid(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;formatId,&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;gtrid[],&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;bqual[])&nbsp;</span><span id="Codehighlighter1_238_325_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_238_325_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.formatId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;formatId;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.gtrid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gtrid;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.bqual&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bqual;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_355_384_Open_Image" onclick="this.style.display='none'; Codehighlighter1_355_384_Open_Text.style.display='none'; Codehighlighter1_355_384_Closed_Image.style.display='inline'; Codehighlighter1_355_384_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_355_384_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_355_384_Closed_Text.style.display='none'; Codehighlighter1_355_384_Open_Image.style.display='inline'; Codehighlighter1_355_384_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getFormatId()&nbsp;</span><span id="Codehighlighter1_355_384_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_355_384_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;formatId;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_424_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_424_450_Open_Text.style.display='none'; Codehighlighter1_424_450_Closed_Image.style.display='inline'; Codehighlighter1_424_450_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_424_450_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_424_450_Closed_Text.style.display='none'; Codehighlighter1_424_450_Open_Image.style.display='inline'; Codehighlighter1_424_450_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;getBranchQualifier()&nbsp;</span><span id="Codehighlighter1_424_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_424_450_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;bqual;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_494_520_Open_Image" onclick="this.style.display='none'; Codehighlighter1_494_520_Open_Text.style.display='none'; Codehighlighter1_494_520_Closed_Image.style.display='inline'; Codehighlighter1_494_520_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_494_520_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_494_520_Closed_Text.style.display='none'; Codehighlighter1_494_520_Open_Image.style.display='inline'; Codehighlighter1_494_520_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;getGlobalTransactionId()&nbsp;</span><span id="Codehighlighter1_494_520_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_494_520_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;gtrid;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
其次，你需要创建一个你要使用的数据库的数据源：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_54_301_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_301_Open_Text.style.display='none'; Codehighlighter1_54_301_Closed_Image.style.display='inline'; Codehighlighter1_54_301_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_54_301_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_54_301_Closed_Text.style.display='none'; Codehighlighter1_54_301_Open_Image.style.display='inline'; Codehighlighter1_54_301_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;DataSource&nbsp;getDataSource()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException&nbsp;</span><span id="Codehighlighter1_54_301_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_54_301_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;SQLServerDataSource&nbsp;xaDS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaDS.setDataSourceName(</span><span style="color: #000000">"</span><span style="color: #000000">SQLServer</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaDS.setServerName(</span><span style="color: #000000">"</span><span style="color: #000000">server</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaDS.setPortNumber(</span><span style="color: #000000">1433</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaDS.setSelectMethod(</span><span style="color: #000000">"</span><span style="color: #000000">cursor</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;xaDS;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;</span></div>
<br />
这个例子是用&#8220;两步提交协议&#8221;来提交一个事务分支：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />XADataSource&nbsp;xaDS;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />XAConnection&nbsp;xaCon;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />XAResource&nbsp;xaRes;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Xid&nbsp;xid;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Connection&nbsp;con;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Statement&nbsp;stmt;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ret;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />xaDS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getDataSource();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />xaCon&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xaDS.getXAConnection(</span><span style="color: #000000">"</span><span style="color: #000000">jdbc_user</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">jdbc_password</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />xaRes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xaCon.getXAResource();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />con&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xaCon.getConnection();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />stmt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;con.createStatement();&nbsp;<br />
<img id="Codehighlighter1_325_330_Open_Image" onclick="this.style.display='none'; Codehighlighter1_325_330_Open_Text.style.display='none'; Codehighlighter1_325_330_Closed_Image.style.display='inline'; Codehighlighter1_325_330_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_325_330_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_325_330_Closed_Text.style.display='none'; Codehighlighter1_325_330_Open_Image.style.display='inline'; Codehighlighter1_325_330_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />xid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyXid(</span><span style="color: #000000">100</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]</span><span id="Codehighlighter1_325_330_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_325_330_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">0x01</span><span style="color: #000000">}</span></span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]</span><span id="Codehighlighter1_343_348_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_343_348_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">0x02</span><span style="color: #000000">}</span></span><span style="color: #000000">);&nbsp;<br />
<img id="Codehighlighter1_357_597_Open_Image" onclick="this.style.display='none'; Codehighlighter1_357_597_Open_Text.style.display='none'; Codehighlighter1_357_597_Closed_Image.style.display='inline'; Codehighlighter1_357_597_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_357_597_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_357_597_Closed_Text.style.display='none'; Codehighlighter1_357_597_Open_Image.style.display='inline'; Codehighlighter1_357_597_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_357_597_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_357_597_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaRes.start(xid,&nbsp;XAResource.TMNOFLAGS);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;stmt.executeUpdate(</span><span style="color: #000000">"</span><span style="color: #000000">insert&nbsp;into&nbsp;test_table&nbsp;values&nbsp;(100)</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaRes.end(xid,&nbsp;XAResource.TMSUCCESS);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xaRes.prepare(xid);&nbsp;<br />
<img id="Codehighlighter1_561_594_Open_Image" onclick="this.style.display='none'; Codehighlighter1_561_594_Open_Text.style.display='none'; Codehighlighter1_561_594_Closed_Image.style.display='inline'; Codehighlighter1_561_594_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_561_594_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_561_594_Closed_Text.style.display='none'; Codehighlighter1_561_594_Open_Image.style.display='inline'; Codehighlighter1_561_594_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ret&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;XAResource.XA_OK)&nbsp;</span><span id="Codehighlighter1_561_594_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_561_594_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;xaRes.commit(xid,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_622_648_Open_Image" onclick="this.style.display='none'; Codehighlighter1_622_648_Open_Text.style.display='none'; Codehighlighter1_622_648_Closed_Image.style.display='inline'; Codehighlighter1_622_648_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_622_648_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_622_648_Closed_Text.style.display='none'; Codehighlighter1_622_648_Open_Image.style.display='inline'; Codehighlighter1_622_648_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(XAException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_622_648_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_622_648_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;e.printStackTrace();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_659_710_Open_Image" onclick="this.style.display='none'; Codehighlighter1_659_710_Open_Text.style.display='none'; Codehighlighter1_659_710_Closed_Image.style.display='inline'; Codehighlighter1_659_710_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_659_710_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_659_710_Closed_Text.style.display='none'; Codehighlighter1_659_710_Open_Image.style.display='inline'; Codehighlighter1_659_710_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_659_710_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_659_710_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;stmt.close();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;con.close();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaCon.close();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span></div>
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">两阶段提交（Two</span><span style="color: #000000">-</span><span style="color: #000000">Phase</span><span style="color: #000000">-</span><span style="color: #000000">Commit）协议<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />首先，两阶段提交（Two</span><span style="color: #000000">-</span><span style="color: #000000">Phase</span><span style="color: #000000">-</span><span style="color: #000000">Commit）事务的启动与常规的单阶段提交（One</span><span style="color: #000000">-</span><span style="color: #000000">Phase</span><span style="color: #000000">-</span><span style="color: #000000">Commit）事务类似。接着，应用程序</span><span style="color: #000000">/</span><span style="color: #000000">客&nbsp;户机对该两阶段提交（Two</span><span style="color: #000000">-</span><span style="color: #000000">Phase</span><span style="color: #000000">-</span><span style="color: #000000">Commit）操作中所涉及的所有数据库执行其修改工作。现在，在最终提交该事务之前，客户机通知参与的数据库准备提交（第&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;阶段）。如果客户机从数据库收到一条&#8220;okay&#8221;，就发出命令向数据库提交该事务（第&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;阶段）。最后分布式事务（Distributed&nbsp;Transaction）结束。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<p>在该应用程序中，如果一个事务分支报告了错误，您就要负责进行错误处理。但是&#8220;两阶段提交协议 简介&#8221;小节中提到仍然存在一个问题，那就是如果第 2 阶段中一个事务分支发生故障，该怎么办呢？</p>
<p>如果再次查看程序代码，您可以看到在&#8220;第 1 阶段&#8221;和&#8220;第 2 阶段&#8221;之间有一个很小的时间间隔。在这一时间间隔中，出于某种理由，其中某一参与数据库可能崩溃。如果发生了，我们将陷入分布式事务已经部分提交的情形中。</p>
<p>假 定下列情形：在&#8220;第 1 阶段&#8221;之后，您从 DB2 和 IDS 数据库中都收到了&#8220;okay&#8221;。在下一步中，应用程序成功提交了 DB2 的事务分支。接着，应用程序通知 DB2 事务分支提交事务。现在，在应用程序可以通知 IDS 事务分支提交它这一部分之前，IDS 引擎由于断电发生崩溃。这就是一种部分提交全局事务的情形。您现在该怎么办呢？</p>
<p>在重启之后，DB2 和 IDS 都将尝试恢复打开的事务分支。该引擎等待来自应用程序的提示如何做。如果应用程序没有准备重新发送&#8220;第 2 阶段&#8221;的提交，该事务分支将被引擎所启动的试探性回滚中止。这是非常糟糕的，因为这将使该全局事务处于不一致状态。</p>
<p>一种解决方案是用一个小型应用程序连接引擎中打开的事务分支，并通知引擎提交或回滚这一打开的事务。如果您使用 IDS 作为后端，那么还有一个隐藏的 onmode 标志，允许您结束打开的事务分支。（onmode -Z xid）。</p>
<p>在 DB2 UDB 中，您可以发出 LIST INDOUBT TRANSACTIONS 来获得打开的 XA 事务的有关信息。您必须查看 DB2 Information Center 中的描述来解决该问题。</p>
<p>上面描述的情形是一个很好的例子，也是使用应用程序服务器（Application Server）或事务监控器（Transaction Monitor）的理由。在使用一个中间层服务器时，就由该服务器负责保持事情正常。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/248196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-12-25 09:28 <a href="http://www.blogjava.net/baoyaer/articles/248196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.5注释语法</title><link>http://www.blogjava.net/baoyaer/articles/239834.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 11 Nov 2008 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/239834.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/239834.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/239834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/239834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/239834.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring的IoCpublic&nbsp;class&nbsp;Foo&nbsp;{①&nbsp;&nbsp;private&nbsp;String&nbsp;name;&nbsp;&nbsp;private&nbsp;int&nbsp;age;&nbsp;&nbsp;public&nbsp;String&nbsp;toString(){&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/239834.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/239834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-11-11 11:36 <a href="http://www.blogjava.net/baoyaer/articles/239834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java annotation</title><link>http://www.blogjava.net/baoyaer/articles/239282.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 07 Nov 2008 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/239282.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/239282.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/239282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/239282.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/239282.html</trackback:ping><description><![CDATA[Annotation简介：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Annotation提供一种机制，将程序中元素（如类、方法、属性等）和元数据联系起来。这样编译器可以将元数据保存的class文件中。代码分析工具就可以使用这些元数据执行的额外任务。注释采用&#8220;at&#8221;标记形式 ( @ )，后面是注释名称。<br />
<br />
自定义&nbsp;annotationDebug.java <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;annotation.test;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.Documented;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.Inherited;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.Retention;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.RetentionPolicy;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.ElementType;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.Target;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_271_331_Open_Image" onclick="this.style.display='none'; Codehighlighter1_271_331_Open_Text.style.display='none'; Codehighlighter1_271_331_Closed_Image.style.display='inline'; Codehighlighter1_271_331_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_271_331_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_271_331_Closed_Text.style.display='none'; Codehighlighter1_271_331_Open_Image.style.display='inline'; Codehighlighter1_271_331_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_271_331_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_271_331_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;annotation类型是一种接口，能够通过java反射API的方式提供对其信息的访问<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_338_400_Open_Image" onclick="this.style.display='none'; Codehighlighter1_338_400_Open_Text.style.display='none'; Codehighlighter1_338_400_Closed_Image.style.display='inline'; Codehighlighter1_338_400_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_338_400_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_338_400_Closed_Text.style.display='none'; Codehighlighter1_338_400_Open_Image.style.display='inline'; Codehighlighter1_338_400_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_338_400_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_338_400_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Documented&nbsp;产生Java&nbsp;Doc文件，这次可以看到文件中包括了@Debug的信息<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />@Documented<br />
<img id="Codehighlighter1_418_880_Open_Image" onclick="this.style.display='none'; Codehighlighter1_418_880_Open_Text.style.display='none'; Codehighlighter1_418_880_Closed_Image.style.display='inline'; Codehighlighter1_418_880_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_418_880_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_418_880_Closed_Text.style.display='none'; Codehighlighter1_418_880_Open_Image.style.display='inline'; Codehighlighter1_418_880_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_418_880_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_418_880_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;限定&nbsp;annotation&nbsp;使用对象&nbsp;-&nbsp;Target&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在定义annotation时，使用java.lang.annotation.Target可以定义annotation使用的时机。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;public&nbsp;enum&nbsp;ElementType&nbsp;{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;TYPE,&nbsp;//&nbsp;适用&nbsp;class,&nbsp;interface,&nbsp;enum<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;FIELD,&nbsp;//&nbsp;适用&nbsp;field<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;METHOD,&nbsp;//&nbsp;适用&nbsp;method<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;PARAMETER,&nbsp;//&nbsp;适用&nbsp;method&nbsp;上之&nbsp;parameter<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;CONSTRUCTOR,&nbsp;//&nbsp;适用&nbsp;constructor<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;LOCAL_VARIABLE,&nbsp;//&nbsp;适用区域变量<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;ANNOTATION_TYPE,&nbsp;//&nbsp;适用&nbsp;annotation&nbsp;型态<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;PACKAGE&nbsp;//&nbsp;适用&nbsp;package<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;}&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_890_934_Open_Image" onclick="this.style.display='none'; Codehighlighter1_890_934_Open_Text.style.display='none'; Codehighlighter1_890_934_Closed_Image.style.display='inline'; Codehighlighter1_890_934_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_890_934_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_890_934_Closed_Text.style.display='none'; Codehighlighter1_890_934_Open_Image.style.display='inline'; Codehighlighter1_890_934_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />@Target(</span><span id="Codehighlighter1_890_934_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_890_934_Open_Text"><span style="color: #000000">{ElementType.CONSTRUCTOR,&nbsp;ElementType.METHOD}</span></span><span style="color: #000000">)</span><span style="color: #008000">//</span><span style="color: #008000">指定目标</span><span style="color: #008000"><br />
<img id="Codehighlighter1_947_1933_Open_Image" onclick="this.style.display='none'; Codehighlighter1_947_1933_Open_Text.style.display='none'; Codehighlighter1_947_1933_Closed_Image.style.display='inline'; Codehighlighter1_947_1933_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_947_1933_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_947_1933_Closed_Text.style.display='none'; Codehighlighter1_947_1933_Open_Image.style.display='inline'; Codehighlighter1_947_1933_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_947_1933_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_947_1933_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Retention&nbsp;在你自定义的形态中，指定编译器如何处理自定义的annotation<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;告知编译器如何处理&nbsp;annotaion&nbsp;-&nbsp;Retention&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;RetentionPolicy<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOURCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译器处理完Annotation信息后就没事了<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLASS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译器将Annotation储存于class档中，预设<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RUNTIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译器将Annotation储存于class檔中，可由VM读入<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;使用java设计的一个程序代码工具，从VM中读出Annotation信息，已在分析程序中使用。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;搭配Reflection机制，就可以实现。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J2SE&nbsp;5.0中新增了java.lang.reflect.AnnotatedElement这个接口，当中定义有四个方法：<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Annotation&nbsp;getAnnotation(Class&nbsp;annotationType);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Annotation[]&nbsp;getAnnotations();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Annotation[]&nbsp;getDeclaredAnnotations();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;isAnnotationPresent(Class&nbsp;annotationType);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class、Constructor、Field、Method、Package等类别，都实作了&nbsp;AnnotatedElement这个接口，<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所以您可以从这些类别的实例上，分别取得标示于其上的Annotation与其信息，<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果&nbsp;RetentionPolicy为RUNTIME的话。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />@Retention(RetentionPolicy.RUNTIME)</span><span style="color: #008000">//</span><span style="color: #008000">设置保持性</span><span style="color: #008000"><br />
<img id="Codehighlighter1_1988_2037_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1988_2037_Open_Text.style.display='none'; Codehighlighter1_1988_2037_Closed_Image.style.display='inline'; Codehighlighter1_1988_2037_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1988_2037_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1988_2037_Closed_Text.style.display='none'; Codehighlighter1_1988_2037_Open_Image.style.display='inline'; Codehighlighter1_1988_2037_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1988_2037_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_1988_2037_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@Inherited&nbsp;子类是否继承父类的&nbsp;annotation&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />@Inherited<br />
<img id="Codehighlighter1_2074_2325_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2074_2325_Open_Text.style.display='none'; Codehighlighter1_2074_2325_Closed_Image.style.display='inline'; Codehighlighter1_2074_2325_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2074_2325_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2074_2325_Closed_Text.style.display='none'; Codehighlighter1_2074_2325_Open_Image.style.display='inline'; Codehighlighter1_2074_2325_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Debug&nbsp;</span><span id="Codehighlighter1_2074_2325_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2074_2325_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">定义了value()方法，编译器在编译时会自动帮您产生一个value的变量成员，接着在使用Debug&nbsp;Annotation时要指定值<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">注释类型的数据成员被设置成使用有限信息进行工作<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">定义数据成员不需要分别定义访问和修改的方法，只需定义一个方法，以数据成员的名称命名它，数据类型应该是该方法返回值的类型．</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value()</span><span style="color: #0000ff">default</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">windfree</span><span style="color: #000000">"</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">默认值的类型必需与成员变量的申明类型一置</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
在程序中使用自定义的annotation<br />
&nbsp;&nbsp;&nbsp;TestDebug.java<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;annotation.test;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_49_158_Open_Image" onclick="this.style.display='none'; Codehighlighter1_49_158_Open_Text.style.display='none'; Codehighlighter1_49_158_Closed_Image.style.display='inline'; Codehighlighter1_49_158_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_49_158_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_49_158_Closed_Text.style.display='none'; Codehighlighter1_49_158_Open_Image.style.display='inline'; Codehighlighter1_49_158_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestDebug&nbsp;</span><span id="Codehighlighter1_49_158_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_49_158_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;@Debug(<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">zgliu</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
<img id="Codehighlighter1_138_156_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_156_Open_Text.style.display='none'; Codehighlighter1_138_156_Closed_Image.style.display='inline'; Codehighlighter1_138_156_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_138_156_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_138_156_Closed_Text.style.display='none'; Codehighlighter1_138_156_Open_Image.style.display='inline'; Codehighlighter1_138_156_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doSomething()&nbsp;</span><span id="Codehighlighter1_138_156_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_138_156_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
使用java中反射API读取class中的元数据的信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DebugTool.java：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;annotation.test;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.Annotation;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.Method;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_123_896_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_896_Open_Text.style.display='none'; Codehighlighter1_123_896_Closed_Image.style.display='inline'; Codehighlighter1_123_896_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_123_896_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_896_Closed_Text.style.display='none'; Codehighlighter1_123_896_Open_Image.style.display='inline'; Codehighlighter1_123_896_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DebugTool&nbsp;</span><span id="Codehighlighter1_123_896_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_123_896_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_196_894_Open_Image" onclick="this.style.display='none'; Codehighlighter1_196_894_Open_Text.style.display='none'; Codehighlighter1_196_894_Closed_Image.style.display='inline'; Codehighlighter1_196_894_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_196_894_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_196_894_Closed_Text.style.display='none'; Codehighlighter1_196_894_Open_Image.style.display='inline'; Codehighlighter1_196_894_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;[]args)</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;NoSuchMethodException&nbsp;</span><span id="Codehighlighter1_196_894_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_196_894_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class</span><span style="color: #000000">&lt;</span><span style="color: #000000">TestDebug</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;c</span><span style="color: #000000">=</span><span style="color: #000000">TestDebug.</span><span style="color: #0000ff">class</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c.getMethod(</span><span style="color: #000000">"</span><span style="color: #000000">doSomething</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_346_593_Open_Image" onclick="this.style.display='none'; Codehighlighter1_346_593_Open_Text.style.display='none'; Codehighlighter1_346_593_Closed_Image.style.display='inline'; Codehighlighter1_346_593_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_346_593_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_346_593_Closed_Text.style.display='none'; Codehighlighter1_346_593_Open_Image.style.display='inline'; Codehighlighter1_346_593_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(method.isAnnotationPresent(Debug.</span><span style="color: #0000ff">class</span><span style="color: #000000">))&nbsp;</span><span id="Codehighlighter1_346_593_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_346_593_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">@Debug&nbsp;is&nbsp;found.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug&nbsp;debug&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;method.getAnnotation(Debug.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">\tvalue&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;debug.value());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">\tname&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;debug.name());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_608_674_Open_Image" onclick="this.style.display='none'; Codehighlighter1_608_674_Open_Text.style.display='none'; Codehighlighter1_608_674_Closed_Image.style.display='inline'; Codehighlighter1_608_674_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_608_674_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_608_674_Closed_Text.style.display='none'; Codehighlighter1_608_674_Open_Image.style.display='inline'; Codehighlighter1_608_674_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_608_674_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_608_674_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">@Debug&nbsp;is&nbsp;not&nbsp;found.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Annotation[]&nbsp;annotations&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;method.getAnnotations();<br />
<img id="Codehighlighter1_786_888_Open_Image" onclick="this.style.display='none'; Codehighlighter1_786_888_Open_Text.style.display='none'; Codehighlighter1_786_888_Closed_Image.style.display='inline'; Codehighlighter1_786_888_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_786_888_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_786_888_Closed_Text.style.display='none'; Codehighlighter1_786_888_Open_Image.style.display='inline'; Codehighlighter1_786_888_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(Annotation&nbsp;annotation&nbsp;:&nbsp;annotations)&nbsp;</span><span id="Codehighlighter1_786_888_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_786_888_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;annotation.annotationType().getName());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
Java标准Annotation<br />
@Deprecated 相当于Javadoc的@deprecated，被@Deprecated标注的对象class, method等被注明为不推荐使用。主要用于javac等编译工具。<br />
@Override 注明对象method重载了父类的方法。javac等编译工具编译时会根据此Annotation判断重载方法是否正确。<br />
@SuppressWarnings 告诉javac等编译器忽略所指定的特定的警告信息。<br />
@Target 被定义的annotation可以附加在那些对象上。<br />
@Retention annotation的作用期间。 <br />
<br />
定义一个annotation<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.Retention;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.RetentionPolicy;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@Retention(RetentionPolicy.RUNTIME)<br />
<img id="Codehighlighter1_153_174_Open_Image" onclick="this.style.display='none'; Codehighlighter1_153_174_Open_Text.style.display='none'; Codehighlighter1_153_174_Closed_Image.style.display='inline'; Codehighlighter1_153_174_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_153_174_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_153_174_Closed_Text.style.display='none'; Codehighlighter1_153_174_Open_Image.style.display='inline'; Codehighlighter1_153_174_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;@</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;MyAnnotation&nbsp;</span><span id="Codehighlighter1_153_174_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_153_174_Open_Text"><span style="color: #000000">{①定义一个注释<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;init();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.annotation.Annotation;<br />
<img id="Codehighlighter1_68_561_Open_Image" onclick="this.style.display='none'; Codehighlighter1_68_561_Open_Text.style.display='none'; Codehighlighter1_68_561_Closed_Image.style.display='inline'; Codehighlighter1_68_561_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_68_561_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_68_561_Closed_Text.style.display='none'; Codehighlighter1_68_561_Open_Image.style.display='inline'; Codehighlighter1_68_561_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestAnnotation&nbsp;</span><span id="Codehighlighter1_68_561_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_68_561_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;@MyAnnotation(init&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)②使用注释<br />
<img id="Codehighlighter1_122_183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_122_183_Open_Text.style.display='none'; Codehighlighter1_122_183_Closed_Image.style.display='inline'; Codehighlighter1_122_183_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_122_183_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_122_183_Closed_Text.style.display='none'; Codehighlighter1_122_183_Open_Image.style.display='inline'; Codehighlighter1_122_183_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print()</span><span id="Codehighlighter1_122_183_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_122_183_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;System.out.println(TestAnnotation.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_242_559_Open_Image" onclick="this.style.display='none'; Codehighlighter1_242_559_Open_Text.style.display='none'; Codehighlighter1_242_559_Closed_Image.style.display='inline'; Codehighlighter1_242_559_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_242_559_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_242_559_Closed_Text.style.display='none'; Codehighlighter1_242_559_Open_Image.style.display='inline'; Codehighlighter1_242_559_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_242_559_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_242_559_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;TestAnnotation&nbsp;ta&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TestAnnotation();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Annotation[]&nbsp;annotations&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ta.getClass().getMethod(</span><span style="color: #000000">"</span><span style="color: #000000">print</span><span style="color: #000000">"</span><span style="color: #000000">).getAnnotations();③<br />
<img id="Codehighlighter1_423_554_Open_Image" onclick="this.style.display='none'; Codehighlighter1_423_554_Open_Text.style.display='none'; Codehighlighter1_423_554_Closed_Image.style.display='inline'; Codehighlighter1_423_554_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_423_554_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_423_554_Closed_Text.style.display='none'; Codehighlighter1_423_554_Open_Image.style.display='inline'; Codehighlighter1_423_554_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Annotation&nbsp;annotation&nbsp;:&nbsp;annotations)&nbsp;&nbsp;</span><span id="Codehighlighter1_423_554_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_423_554_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">MyAnnotation.init&nbsp;:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((MyAnnotation)annotation).init());④打印出init的值<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
我们定义了一个名为MyAnnotation的注释而这个注释中只有一个类型为int名为init的属性，我们在②处使用了我们刚刚定义的注释并且为init赋值为2，在③处我们通过反射机制获得print方法上定义的所有注释然后通过迭代将其值init打印至控制台。<br />
<br />
最终在控制台输出以下信息：<br />
MyAnnotation.init : 2
<img src ="http://www.blogjava.net/baoyaer/aggbug/239282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-11-07 16:44 <a href="http://www.blogjava.net/baoyaer/articles/239282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2SE5.0中最有趣的新特性：注释(annotation) [zt]</title><link>http://www.blogjava.net/baoyaer/articles/219356.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 01 Aug 2008 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/219356.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/219356.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/219356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/219356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/219356.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; 本文将向你介绍J2SE5.0中的新特性之一：注释。本文将从什么是注释；J2SE5.0中预定义的注释；如何自定义注释；如何对注释进行注释以及如何在程序中读取注释5个方面进行讨论。一、什么是注释&nbsp;&nbsp;&nbsp; 说起注释，得先提一提什么是元数据(metadata)。所谓元数据就是数据的数据。也就是说，元数据是描述数据的。就象数据表中的字...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/219356.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/219356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-08-01 15:29 <a href="http://www.blogjava.net/baoyaer/articles/219356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java nio  在探索</title><link>http://www.blogjava.net/baoyaer/articles/207451.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 12 Jun 2008 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/207451.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/207451.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/207451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/207451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/207451.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: nio之所以为为新，在于它并没在原来I/O的基础上进行开发，而是提供了全新的类和接口，除了原来的基本功能之外，它还提供了以下新的特征：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ► 多路选择的非封锁式I/O设施&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ►支持文件锁和内存映射&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/207451.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/207451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-06-12 17:24 <a href="http://www.blogjava.net/baoyaer/articles/207451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 代码优化</title><link>http://www.blogjava.net/baoyaer/articles/205989.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 05 Jun 2008 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/205989.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/205989.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/205989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/205989.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/205989.html</trackback:ping><description><![CDATA[<p><strong>Java</strong>程序中的内存管理机制是通过<strong>GC</strong>完成的，&#8220;一个对象创建后被放置在<strong>JVM</strong>的堆内存中，当永远不在应用这个对象的时候将会被<strong>JVM</strong>在堆内存中回收。被创建的对象不能再生，同时也没有办法通过程序语句释放&#8221;<font color="#408080">（这个是《Java的GC机制》中提到的定义，呵呵，还依稀记得）</font>这就是<strong>GC</strong>对垃圾对象的定义。个人感觉这么解释或许会比较快理解：在运行环境中JVM会对两种内存进行管理，一种是堆内存（对象实例或者变量），一种是栈内存（静态或非静态方法），而J<strong>VM</strong>所管理的内存区域实际上就是堆内存＋栈内存（<strong>MS</strong>：对象实例＋实例化变量＋静态方法＋非静态方法），当<strong>JVM</strong>在其所管理的内存区域的中无法通过根集合到达对象的时候就会将此对象作为垃圾对象实施回收。<br />
<br />
下面是我在项目中对代码进行优化的几点尝试，备忘<br />
<br />
1.循环优化<br />
缺：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">List&nbsp;alist=uSvr.getUserinfoList();<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">alist</span><span style="color: #ff0000">.size();i++){<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" />}</span></div>
此种方式会一直去执行alist.size()方法，带来性能消耗，改为<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">for(int&nbsp;i=0&nbsp;p=alist.size();i</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #ff0000">;i++){<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />}</span></div>
<br />
2.循环内不要创建对象<br />
缺;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_31_110_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_110_Open_Text.style.display='none'; Codehighlighter1_31_110_Closed_Image.style.display='inline'; Codehighlighter1_31_110_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_31_110_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_31_110_Closed_Text.style.display='none'; Codehighlighter1_31_110_Open_Image.style.display='inline'; Codehighlighter1_31_110_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;=</span><span style="color: #000000">domainCount;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_31_110_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_31_110_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />AuditResult&nbsp;auditResult&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AuditResult();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />..<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
这种做法会在内存中保存N份这个对象的引用//会浪费大量的内存空间，改为<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />AuditResult&nbsp;auditResult;<br />
<img id="Codehighlighter1_57_122_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_122_Open_Text.style.display='none'; Codehighlighter1_57_122_Closed_Image.style.display='inline'; Codehighlighter1_57_122_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_57_122_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_57_122_Closed_Text.style.display='none'; Codehighlighter1_57_122_Open_Image.style.display='inline'; Codehighlighter1_57_122_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;=</span><span style="color: #000000">domainCount;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_57_122_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_57_122_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />auditResult</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AuditResult();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />..<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p>&nbsp;3.&nbsp; 什么样的对象可以将其认定为不可视阶段呢？举个例子吧，在try{...}catch(Exception){...}代码中，如果在try的代码块中声明了一个obj，那么当整个 try{...}catch(Exception){...}代码段执行完毕以后这个obj实际上就已经属于不可视阶段了。<br />
<br />
所以，应该采用如下方式<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_3_40_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3_40_Open_Text.style.display='none'; Codehighlighter1_3_40_Closed_Image.style.display='inline'; Codehighlighter1_3_40_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_3_40_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3_40_Closed_Text.style.display='none'; Codehighlighter1_3_40_Open_Image.style.display='inline'; Codehighlighter1_3_40_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">try</span><span id="Codehighlighter1_3_40_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_3_40_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;Object&nbsp;obj</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object();<br />
<img id="Codehighlighter1_59_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_59_71_Open_Text.style.display='none'; Codehighlighter1_59_71_Closed_Image.style.display='inline'; Codehighlighter1_59_71_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_59_71_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_59_71_Closed_Text.style.display='none'; Codehighlighter1_59_71_Open_Image.style.display='inline'; Codehighlighter1_59_71_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Excepione&nbsp;e)</span><span id="Codehighlighter1_59_71_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_59_71_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />obj</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p><br />
4.少用new创建对象<br />
用new关键词创建类的实例时，构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口，我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。<br />
缺：<br />
在使用设计模式(Design Pattern)的场合，如果用Factory模式创建对象，则改用clone()方法创建新的对象实例非常简单。例如，下面是Factory模式的一个典型实现： <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Credit&nbsp;getNewCredit()&nbsp;<br />
<img id="Codehighlighter1_39_72_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_72_Open_Text.style.display='none'; Codehighlighter1_39_72_Closed_Image.style.display='inline'; Codehighlighter1_39_72_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_39_72_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_39_72_Closed_Text.style.display='none'; Codehighlighter1_39_72_Open_Image.style.display='inline'; Codehighlighter1_39_72_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />　　</span><span id="Codehighlighter1_39_72_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_39_72_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Credit();&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
改为<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Credit&nbsp;BaseCredit&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Credit();&nbsp;<br />
<img id="Codehighlighter1_89_134_Open_Image" onclick="this.style.display='none'; Codehighlighter1_89_134_Open_Text.style.display='none'; Codehighlighter1_89_134_Closed_Image.style.display='inline'; Codehighlighter1_89_134_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_89_134_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_89_134_Closed_Text.style.display='none'; Codehighlighter1_89_134_Open_Image.style.display='inline'; Codehighlighter1_89_134_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Credit&nbsp;getNewCredit()&nbsp;　</span><span id="Codehighlighter1_89_134_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_89_134_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(Credit)&nbsp;BaseCredit.clone();&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
当new创建对象不可避免时，注意避免多次的使用new初始化一个对象。 尽量在使用时再创建该对象。 <br />
缺：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">NewObject&nbsp;object&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;NewObject();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;value;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(i＞</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)<br />
<img id="Codehighlighter1_56_85_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_85_Open_Text.style.display='none'; Codehighlighter1_56_85_Closed_Image.style.display='inline'; Codehighlighter1_56_85_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_56_85_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_56_85_Closed_Text.style.display='none'; Codehighlighter1_56_85_Open_Image.style.display='inline'; Codehighlighter1_56_85_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_56_85_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_56_85_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">object.getValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;</span></div>
<p>改为<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;value;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(i＞</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)<br />
<img id="Codehighlighter1_20_86_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_86_Open_Text.style.display='none'; Codehighlighter1_20_86_Closed_Image.style.display='inline'; Codehighlighter1_20_86_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_20_86_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_20_86_Closed_Text.style.display='none'; Codehighlighter1_20_86_Open_Image.style.display='inline'; Codehighlighter1_20_86_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_20_86_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_20_86_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　NewObject&nbsp;object&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;NewObject();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　Value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">object.getValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>5.乘法和除法考虑<br />
<br />
缺：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_38_89_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_89_Open_Text.style.display='none'; Codehighlighter1_38_89_Closed_Image.style.display='inline'; Codehighlighter1_38_89_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_38_89_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_38_89_Closed_Text.style.display='none'; Codehighlighter1_38_89_Open_Image.style.display='inline'; Codehighlighter1_38_89_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">　</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(val&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;val&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100000</span><span style="color: #000000">;&nbsp;val&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">5</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_38_89_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_38_89_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　　alterX&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;val&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">8</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　　myResult&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;val&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>改为：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_38_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_91_Open_Text.style.display='none'; Codehighlighter1_38_91_Closed_Image.style.display='inline'; Codehighlighter1_38_91_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_38_91_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_38_91_Closed_Text.style.display='none'; Codehighlighter1_38_91_Open_Image.style.display='inline'; Codehighlighter1_38_91_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(val&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;val&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100000</span><span style="color: #000000">;&nbsp;val&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_38_91_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_38_91_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　　alterX&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;val&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　　myResult&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;val&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />　　}</span></span><span style="color: #000000">&nbsp;</span></div>
<p>6.尽量多的使用stringbuffer<br />
7清除Session <br />
　　通常情况，当达到设定的超时时间时，同时有些Session没有了活动，服务器会释放这些没有活动的Session，.. 不过这种情况下，特别是多用户并访时，系统内存要维护多个的无效Session。 <br />
当用户退出时，应该手动释放，回收资源，实现如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">HttpSession&nbsp;theSession&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getSession();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;获取当前Session</span><span style="color: #008000"><br />
<img id="Codehighlighter1_84_127_Open_Image" onclick="this.style.display='none'; Codehighlighter1_84_127_Open_Text.style.display='none'; Codehighlighter1_84_127_Closed_Image.style.display='inline'; Codehighlighter1_84_127_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_84_127_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_84_127_Closed_Text.style.display='none'; Codehighlighter1_84_127_Open_Image.style.display='inline'; Codehighlighter1_84_127_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(theSession&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_84_127_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_84_127_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　theSession.invalidate();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;使该Session失效</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">&nbsp;</span></div>
<p><br />
<br />
<br />
<font color="#004080"><strong>NOTE</strong>：堆内存是在<strong>JVM</strong>启动的时候创建，堆内存分为新对象与老对象。对于新对象好像会分三个区域。当优先级最高的区域的堆栈满了以后<strong>JVM</strong>将会进行测试，测试内容是那些对象不可到达，不可到达的对象将会放入到老对象区域。同时<strong>JVM</strong>会将所有对象拷贝到另外两个区域中，然后经过一段时间依然没有引用的对象会进入老对象区域。对于老对象区域而言基本上就是等待被<strong>GC</strong>回收的对象了。<font color="#004080">（这些还是在大学时学<strong>.net</strong>时候的知识，直接换成<strong>java</strong>定义我想其中概念应该一样。</font></font></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/205989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-06-05 10:49 <a href="http://www.blogjava.net/baoyaer/articles/205989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSO单点登录解决方案[转载] </title><link>http://www.blogjava.net/baoyaer/articles/202891.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 26 May 2008 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/202891.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/202891.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/202891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/202891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/202891.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/Jack2007/archive/2008/04/10/191795.html">SSO单点登录解决方案[转载]</a> </div>
<strong>1 什么是单点登陆</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单点登录（Single Sign On），简称为 SSO，是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中，用户只需要登录一次就可以访问所有相互信任的应用系统。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 较大的企业内部，一般都有很多的业务支持系统为其提供相应的管理和IT服务。例如财务系统为财务人员提供财务的管理、计算和报表服务；人事系统为人事部门 提供全公司人员的维护服务；各种业务系统为公司内部不同的业务提供不同的服务等等。这些系统的目的都是让<a onclick="javascript:tagshow(event, '%BC%C6%CB%E3%BB%FA');" href="javascript:;" target="_self"><u><strong>计算机</strong></u></a>来进行复杂繁琐的计算工作，来替代人力的手 工劳动，提高工作效率和质量。这些不同的系统往往是在不同的时期建设起来的，运行在不同的平台上；也许是由不同厂商开发，使用了各种不同的技术和标准。如 果举例说国内一著名的IT公司（名字隐去），内部共有60多个业务系统，这些系统包括两个不同版本的SAP的ERP系统，12个不同类型和版本的数据库系 统，8个不同类型和版本的操作系统，以及使用了3种不同的防火墙技术，还有数十种互相不能兼容的协议和标准，你相信吗？不要怀疑，这种情况其实非常普遍。 每一个应用系统在运行了数年以后，都会成为不可替换的企业IT架构的一部分，如下图所示。<br />
<a href="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image002.gif"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image002.gif" width="520" /></a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着企业的发展，业务系统的数量在不断的增加，老的系统却不能轻易的替换，这会带来很多的开销。其一是管理上的开销，需要维护的系统越来越多。很多系统的 数据是相互冗余和重复的，数据的不一致性会给管理工作带来很大的压力。业务和业务之间的相关性也越来越大，例如公司的计费系统和财务系统，财务系统和人事 系统之间都不可避免的有着密切的关系。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了降低管理的消耗，最大限度的重用已有投资的系统，很多企业都在进行着企业应用集成（EAI）。企业应用集成可以在不同层面上进行：例如在数据存储层面 上的&#8220;数据大集中&#8221;，在传输层面上的&#8220;通用数据交换平台&#8221;，在应用层面上的&#8220;业务流程整合&#8221;，和用户界面上的&#8220;通用企业门户&#8221;等等。事实上，还用一个层面 上的集成变得越来越重要，那就是&#8220;身份认证&#8221;的整合，也就是&#8220;单点登录&#8221;。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常来说，每个单独的系统都会有自己的安全体系和身份认证系统。整合以前，进入每个系统都需要进行登录，这样的局面不仅给管理上带来了很大的困难，在安全方面也埋下了重大的隐患。下面是一些著名的调查公司显示的统计数据：
<ul>
    <li>用户每天平均16分钟花在身份验证任务上 - 资料来源：IDS
    <li>频繁的IT用户平均有21个密码 - 资料来源：NTA Monitor Password Survey
    <li>49%的人写下了其密码，而67%的人很少改变它们
    <li>每79秒出现一起身份被窃事件 - 资料来源：National Small Business Travel Assoc
    <li>全球欺骗损失每年约12B - 资料来源：Comm Fraud Control Assoc
    <li>到2007年，身份管理市场将成倍增长至$4.5B - 资料来源：IDS </li>
</ul>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用&#8220;单点登录&#8221;整合后，只需要登录一次就可以进入多个系统，而不需要重新登录，这不仅仅带来了更好的用户体验，更重要的是降低了安全的风险和管理的消耗。请看下面的统计数据：
<ul>
    <li>提高IT效率：对于每1000个受管用户，每用户可节省$70K
    <li>帮助台呼叫减少至少1/3，对于10K员工的公司，每年可以节省每用户$75，或者合计$648K
    <li>生产力提高：每个新员工可节省$1K，每个老员工可节省$350 - 资料来源：Giga
    <li>ROI回报：7.5到13个月 - 资料来源：Gartner&nbsp;&nbsp;&nbsp; </li>
</ul>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，使用&#8220;单点登录&#8221;还是<a onclick="javascript:tagshow(event, 'SOA');" href="javascript:;" target="_self"><u><strong>SOA</strong></u></a>时代的需求之一。在面向服务的架构中，服务和服务之间，程序和程序之间的通讯大量存在，服务之间的安全认证是SOA应用的难点之一，应此建立&#8220;单点登录&#8221;的系统体系能够大大简化SOA的安全问题，提高服务之间的合作效率。<br />
&nbsp;&nbsp;&nbsp;<strong>2 单点登陆的技术实现机制</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着SSO技术的流行，SSO的产品也是满天飞扬。所有著名的软件厂商都提供了相应的解决方案。在这里我并不想介绍自己公司（<a onclick="javascript:tagshow(event, 'Sun');" href="javascript:;" target="_self"><u><strong>Sun</strong></u></a> Microsystems）的产品，而是对SSO技术本身进行解析，并且提供自己开发这一类产品的方法和简单演示。有关我写这篇文章的目的，请参考我的博 客（<a href="http://yuwang881.blog.sohu.com/3184816.html">http://yuwang881.blog.sohu.com/3184816.html</a>）。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单点登录的机制其实是比较简单的，用一个现实中的例子做比较。颐和园是北京著名的旅游景点，也是我常去的地方。在颐和园内部有许多独立的景点，例如&#8220;苏州 街&#8221;、&#8220;佛香阁&#8221;和&#8220;德和园&#8221;，都可以在各个景点门口单独买票。很多游客需要游玩所有德景点，这种买票方式很不方便，需要在每个景点门口排队买票，钱包拿 进拿出的，容易丢失，很不安全。于是绝大多数游客选择在大门口买一张通票（也叫套票），就可以玩遍所有的景点而不需要重新再买票。他们只需要在每个景点门 口出示一下刚才买的套票就能够被允许进入每个独立的景点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单点登录的机制也一样，如下图所示，当用户第一次访问应用系统1的时候，因为还没有登录，会被引导到认证系统中进行登录（1）；根据用户提供的登录信息， 认证系统进行身份效验，如果通过效验，应该返回给用户一个认证的凭据－－ticket（2）；用户再访问别的应用的时候（3，5）就会将这个ticket 带上，作为自己认证的凭据，应用系统接受到请求之后会把ticket送到认证系统进行效验，检查ticket的合法性（4，6）。如果通过效验，用户就可 以在不用再次登录的情况下访问应用系统2和应用系统3了。<br />
<img title="点击图片可在新窗口打开" style="cursor: pointer" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image004.gif" />&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从上面的视图可以看出，要实现SSO，需要以下主要的功能：
<ul>
    <li>所有应用系统共享一个身份认证系统。<br />
    统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较，对用户进行登录认证；认证成功后，认证系统应该生成统一的认证标志（ticket），返还给用户。另外，认证系统还应该对ticket进行效验，判断其有效性。
    <li>所有应用系统能够识别和提取ticket信息<br />
    要实现SSO的功能，让用户只登录一次，就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取，通过与认证系统的通讯，能自动判断当前用户是否登录过，从而完成单点登录的功能。&nbsp;&nbsp;&nbsp; </li>
</ul>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的功能只是一个非常简单的SSO架构，在现实情况下的SSO有着更加复杂的结构。有两点需要指出的是：
<ul>
    <li>单一的用户信息数据库并不是必须的，有许多系统不能将所有的用户信息都集中存储，应该允许用户信息放置在不同的存储中，如下图所示。事实上，只要统一认证系统，统一ticket的产生和效验，无论用户信息存储在什么地方，都能实现单点登录。&nbsp;&nbsp;&nbsp;&nbsp; </li>
</ul>
<br />
<img title="点击图片可在新窗口打开" style="cursor: pointer" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image006.gif" /><br />
<ul>
    <li>统一的认证系统并不是说只有单个的认证服务器，如下图所示，整个系统可以存在两个以上的认证服务器，这些服务器甚至可以是不同的产品。认证服务器 之间要通过标准的通讯协议，互相交换认证信息，就能完成更高级别的单点登录。如下图，当用户在访问应用系统1时，由第一个认证服务器进行认证后，得到由此 服务器产生的ticket。当他访问应用系统4的时候，认证服务器2能够识别此ticket是由第一个服务器产生的，通过认证服务器之间标准的通讯协议 （例如SAML）来交换认证信息，仍然能够完成SSO的功能。 </li>
</ul>
<br />
<img title="点击图片可在新窗口打开" style="cursor: pointer" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image008.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>3 WEB-SSO的实现</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着互联网的高速发展，<a onclick="javascript:tagshow(event, 'WEB');" href="javascript:;" target="_self"><u><strong>WEB</strong></u></a>应用几乎统治了绝大部分的软件应用系统，因此WEB-SSO是SSO应用当中最为流行。WEB-SSO有其自身的特点和优 势，实现起来比较简单易用。很多商业软件和<a onclick="javascript:tagshow(event, '%BF%AA%D4%B4');" href="javascript:;" target="_self"><u><strong>开源</strong></u></a>软件都有对WEB-SSO的实现。其中值得一提的是OpenSSO （<a href="https://opensso.dev.java.net/">https://opensso.dev.java.net</a>），为用<a onclick="javascript:tagshow(event, 'Java');" href="javascript:;" target="_self"><u><strong>Java</strong></u></a>实现WEB-SSO提供架构指南和服务指南，为用户自己来实现WEB-SSO提供了理论的依据和实现的方法。&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么说WEB-SSO比较容易实现呢？这是有WEB应用自身的特点决定的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 众所周知，Web协议（也就是HTTP）是一个无状态的协议。一个Web应用由很多个Web页面组成，每个页面都有唯一的URL来定义。用户在浏览器的地 址栏输入页面的URL，浏览器就会向Web <a onclick="javascript:tagshow(event, 'Server');" href="javascript:;" target="_self"><u><strong>Server</strong></u></a>去发送请求。如下图，浏览器向Web服务器发送了两个请求，申请了两个页面。这两个页面的请求是分别使用了两个单独的HTTP连接。所谓无状 态的协议也就是表现在这里，浏览器和Web服务器会在第一个请求完成以后关闭连接通道，在第二个请求的时候重新建立连接。Web服务器并不区分哪个请求来 自哪个客户端，对所有的请求都一视同仁，都是单独的连接。这样的方式大大区别于传统的（Client/Server）C/S结构,在那样的应用中，客户端 和服务器端会建立一个长时间的专用的连接通道。正是因为有了无状态的特性，每个连接资源能够很快被<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target="_self"><u><strong>其他</strong></u></a>客户端所重用，一台Web服务器才能够同时服务于成 千上万的客户端。<br />
<img title="点击图片可在新窗口打开" style="cursor: pointer" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image010.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是我们通常的应用是有状态的。先不用提不同应用之间的SSO，在同一个应用中也需要保存用户的登录身份信息。例如用户在访问页面1的时候进行了登录，但 是刚才也提到，客户端的每个请求都是单独的连接，当客户再次访问页面2的时候，如何才能告诉Web服务器，客户刚才已经登录过了呢？浏览器和服务器之间有 约定：通过使用cookie技术来维护应用的状态。Cookie是可以被Web服务器设置的字符串，并且可以保存在浏览器中。如下图所示，当浏览器访问了 页面1时，web服务器设置了一个cookie，并将这个cookie和页面1一起返回给浏览器，浏览器接到cookie之后，就会保存起来，在它访问页 面2的时候会把这个cookie也带上，Web服务器接到请求时也能读出cookie的值，根据cookie值的内容就可以判断和恢复一些用户的信息状 态。<br />
<img title="点击图片可在新窗口打开" style="cursor: pointer" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image012.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web-SSO完全可以利用Cookie结束来完成用户登录信息的保存，将浏览器中的Cookie和上文中的Ticket结合起来，完成SSO的功能。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了完成一个简单的SSO的功能，需要两个部分的合作：
<ul>
    <li>统一的身份认证服务。
    <li>修改Web应用，使得每个应用都通过这个统一的认证服务来进行身份效验。 </li>
</ul>
<br />
&nbsp;&nbsp;&nbsp;<strong>3.1 Web SSO 的样例</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据上面的原理，我用<a onclick="javascript:tagshow(event, 'J2EE');" href="javascript:;" target="_self"><u><strong>J2EE</strong></u></a>的技术（<a onclick="javascript:tagshow(event, 'JSP');" href="javascript:;" target="_self"><u><strong>JSP</strong></u></a>和Servlet）完成了一个具有Web-SSO的简单样例。样例包含一个身份认证的服务器和两个简单的 Web应用，使得这两个 Web应用通过统一的身份认证服务来完成Web-SSO的功能。此样例所有的源代码和二进制代码都可以从网站地址<a href="http://gceclub.sun.com.cn/wangyu/">http://gceclub.sun.com.cn/wangyu/</a>下载。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 样例下载、安装部署和运行指南：
<ul>
    <li>Web-SSO的样例是由三个标准Web应用组成，压缩成三个zip文件，从<a href="http://gceclub.sun.com.cn/wangyu/web-sso/">http://gceclub.sun.com.cn/wangyu/web-sso/</a>中下载。其中SSOAuth（<a href="http://gceclub.sun.com.cn/wangyu/web-sso/SSOAuth.zip">http://gceclub.sun.com.cn/wangyu/web-sso/SSOAuth.zip</a>）是身份认证服务；SSOWebDemo1（<a href="http://gceclub.sun.com.cn/wangyu/web-sso/SSOWebDemo1.zip">http://gceclub.sun.com.cn/wangyu/web-sso/SSOWebDemo1.zip</a>）和SSOWebDemo2（<a href="http://gceclub.sun.com.cn/wangyu/web-sso/SSOWebDemo2.zip">http://gceclub.sun.com.cn/wangyu/web-sso/SSOWebDemo2.zip</a>） 是两个用来演示单点登录的Web应用。这三个Web应用之所以没有打成war包，是因为它们不能直接部署，根据读者的部署环境需要作出小小的修改。样例部 署和运行的环境有一定的要求，需要符合Servlet2.3以上标准的J2EE容器才能运行（例如Tomcat5,Sun Application Server 8, Jboss 4等）。另外，身份认证服务需要JDK1.5的运行环境。之所以要用JDK1.5是因为笔者使用了一个线程安全的高性能的Java集合类 &#8220;ConcurrentMap&#8221;，只有在JDK1.5中才有。
    <li>这三个Web应用完全可以单独部署，它们可以分别部署在 不同的机器，不同的操作系统和不同的J2EE的产品上，它们完全是标准的和平台无关的应用。但是有一个限制，那两台部署应用（demo1、demo2）的 机器的域名需要相同，这在后面的章节中会解释到cookie和domain的关系以及如何制作跨域的WEB-SSO<br />
    解压缩SSOAuth.zip文件，在/WEB-INF/下的web.xml中请修改&#8220;domainname&#8221;的属性以反映实际的应用部署情况， domainname需要设置为两个单点登录的应用（demo1和demo2）所属的域名。这个domainname和当前SSOAuth服务部署的机器 的域名没有关系。我缺省设置的是&#8220;.sun.com&#8221;。如果你部署demo1和demo2的机器没有域名，请输入IP地址或主机名（如 localhost），但是如果使用IP地址或主机名也就意味着demo1和demo2需要部署到一台机器上了。设置完后，根据你所选择的J2EE容器， 可能需要将SSOAuth这个目录压缩打包成war文件。用&#8220;jar -cvf SSOAuth.war SSOAuth/&#8221;就可以完成这个功能。
    <li>解压缩SSOWebDemo1和SSOWebDemo2文件，分别在它们/WEB-INF/下找到web.xml文件，请修改其中的几个初始化参数 </li>
</ul>
<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;SSOServiceURL&lt;/param-name&gt;<br />
&lt;param-value&gt;http://wangyu.prc.sun.com:8080/SSOAuth/SSOAuth&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;SSOLoginPage&lt;/param-name&gt;<br />
&lt;param-value&gt;http://wangyu.prc.sun.com:8080/SSOAuth/login.jsp&lt;/param-value&gt;<br />
&lt;/init-param&gt;
<ul>
    <li>将其中的SSOServiceURL和SSOLoginPage修改成部署SSOAuth应用的机器名、端口号以及根路径（缺省是 SSOAuth）以反映实际的部署情况。设置完后，根据你所选择的J2EE容器，可能需要将SSOWebDemo1和SSOWebDemo2这两个目录压 缩打包成两个war文件。用&#8220;jar -cvf SSOWebDemo1.war SSOWebDemo1/&#8221;就可以完成这个功能。
    <li>请输入第一个web应用的测试URL（test.jsp）,例如<a href="http://wangyu.prc.sun.com:8080/">http://wangyu.prc.sun.com:8080/</a>SSOWebDemo1/test.jsp，如果是第一次访问，便会自动跳转到登录界面，如下图。 </li>
</ul>
<br />
<img title="点击图片可在新窗口打开" style="cursor: pointer" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image014.gif" />
<ul>
    <li>使用系统自带的三个帐号之一登录（例如，用户名：wangyu,密码：wangyu），便能成功的看到test.jsp的内容：显示当前用户名和欢迎信息。 </li>
</ul>
<br />
<img title="点击图片可在新窗口打开" style="cursor: pointer" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image016.gif" width="520" />
<ul>
    <li>请接着在同一个浏览器中输入第二个web应用的测试URL（test.jsp）,例如<a href="http://wangyu.prc.sun.com:8080/">http://wangyu.prc.sun.com:8080/</a>SSOWebDemo2/test.jsp。你会发现，不需要再次登录就能看到test.jsp的内容，同样是显示当前用户名和欢迎信息，而且欢迎信息中明确的显示当前的应用名称（demo2）。&nbsp;&nbsp;&nbsp; </li>
</ul>
<br />
<img title="点击图片可在新窗口打开" style="cursor: pointer" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/javachannel/image018.gif" width="520" /><br />
&nbsp;&nbsp;&nbsp;<strong>3.2 WEB-SSO代码讲解</strong><br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2.1身份认证服务代码解析</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web-SSO的源代码可以从网站地址<a href="http://gceclub.sun.com.cn/wangyu/web-sso/websso_src.zip">http://gceclub.sun.com.cn/wangyu/web-sso/websso_src.zip</a>下 载。身份认证服务是一个标准的web应用，包括一个名为SSOAuth的Servlet，一个login.jsp文件和一个failed.html。身份 认证的所有服务几乎都由SSOAuth的Servlet来实现了；login.jsp用来显示登录的页面（如果发现用户还没有登录过）； failed.html是用来显示登录失败的信息（如果用户的用户名和密码与信息数据库中的不一样）。<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSOAuth的代码如下面的列表显示，结构非常简单，先看看这个Servlet的主体部分：<br />
package DesktopSSO;<br />
<br />
import java.io.*;<br />
import java.net.*;<br />
import java.text.*;<br />
import java.util.*;<br />
import java.util.concurrent.*;<br />
<br />
import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
<br />
<br />
public class SSOAuth extends HttpServlet {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static private ConcurrentMap accounts;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static private ConcurrentMap SSOIDs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String cookiename="WangYuDesktopSSOID";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String domainname;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void init(ServletConfig config) throws ServletException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.init(config);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domainname= config.getInitParameter("domainname");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookiename = config.getInitParameter("cookiename");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSOIDs = new ConcurrentHashMap();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; accounts=new ConcurrentHashMap();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; accounts.put("wangyu", "wangyu");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; accounts.put("paul", "paul");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; accounts.put("carol", "carol");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter ut = response.getWriter();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String action = request.getParameter("action");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String result="failed";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (action==null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handlerFromLogin(request,response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (action.equals("authcookie")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String myCookie = request.getParameter("cookiename");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (myCookie != null) result = authCookie(myCookie);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print(result);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (action.equals("authuser")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result=authNameAndPasswd(request,response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print(result);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (action.equals("logout")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String myCookie = request.getParameter("cookiename");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logout(myCookie);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
.....<br />
<br />
}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从代码很容易看出，SSOAuth就是一个简单的Servlet。其中有两个静态成员变量：accounts和SSOIDs，这两个成员变量都使用了 JDK1.5中线程安全的MAP类： ConcurrentMap，所以这个样例一定要JDK1.5才能运行。Accounts用来存放用户的用户名和密码，在init()的方法中可以看到我 给系统添加了三个合法的用户。在实际应用中，accounts应该是去数据库中或LDAP中获得，为了简单起见，在本样例中我使用了 ConcurrentMap在内存中用程序创建了三个用户。而SSOIDs保存了在用户成功的登录后所产生的cookie和用户名的对应关系。它的功能显 而易见：当用户成功登录以后，再次访问别的系统，为了鉴别这个用户请求所带的cookie的有效性，需要到SSOIDs中检查这样的映射关系是否存在。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在主要的请求处理方法processRequest()中，可以很清楚的看到SSOAuth的所有功能。
<ul>
    <li>如果用户还没有登录过，是第一次登录本系统，会被跳转到login.jsp页面（在后面会解释如何跳转）。用户在提供了用户名和密码以后，就会用handlerFromLogin()这个方法来验证。
    <li>如果用户已经登录过本系统，再访问别的应用的时候，是不需要再次登录的。因为浏览器会将第一次登录时产生的cookie和请求一起发送。效验cookie的有效性是SSOAuth的主要功能之一。
    <li>SSOAuth还能直接效验非login.jsp页面过来的用户名和密码的效验请求。这个功能是用于非web应用的SSO，这在后面的桌面SSO中会用到。
    <li>SSOAuth还提供logout服务。&nbsp;&nbsp;&nbsp; </li>
</ul>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面看看几个主要的功能函数：<br />
private void handlerFromLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String username = request.getParameter("username");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String password = request.getParameter("password");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String pass = (String)accounts.get(username);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((pass==null)||(!pass.equals(password)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getServletContext().getRequestDispatcher("/failed.html").forward(request, response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String gotoURL = request.getParameter("goto");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String newID = createUID();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSOIDs.put(newID, username);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie wangyu = new Cookie(cookiename, newID);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wangyu.setDomain(domainname);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wangyu.setMaxAge(60000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wangyu.setValue(newID);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wangyu.setPath("/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.addCookie(wangyu);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("login success, goto back url:" + gotoURL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (gotoURL != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter ut = response.getWriter();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.sendRedirect(gotoURL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&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; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handlerFromLogin()这个方法是用来处理来自login.jsp的登录请求。它的逻辑很简单：将用户输入的用户名和密码与预先设定好的用 户集合（存放在accounts中）相比较，如果用户名或密码不匹配的话，则返回登录失败的页面（failed.html），如果登录成功的话，需要为用 户当前的session创建一个新的ID，并将这个ID和用户名的映射关系存放到SSOIDs中，最后还要将这个ID设置为浏览器能够保存的cookie 值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 登录成功后，浏览器会到哪个页面呢？那我们回顾一下我们是如何使用身份认证服务的。一般来说我们不会直接访问身份服务的任何URL，包括 login.jsp。身份服务是用来保护其他应用服务的，用户一般在访问一个受SSOAuth保护的Web应用的某个URL时，当前这个应用会发现当前的 用户还没有登录，便强制将也页面转向SSOAuth的login.jsp，让用户登录。如果登录成功后，应该自动的将用户的浏览器指向用户最初想访问的那 个URL。在handlerFromLogin()这个方法中，我们通过接收&#8220;goto&#8221;这个参数来保存用户最初访问的URL，成功后便重新定向到这个页 面中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外一个要说明的是，在设置cookie的时候，我使用了一个setMaxAge(6000)的方法。这个方法是用来设置cookie的有效期，单位是 秒。如果不使用这个方法或者参数为负数的话，当浏览器关闭的时候，这个cookie就失效了。在这里我给了很大的值（1000分钟），导致的行为是：当你 关闭浏览器（或者关机），下次再打开浏览器访问刚才的应用，只要在1000分钟之内，就不需要再登录了。我这样做是下面要介绍的桌面SSO中所需要的功 能。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其他的方法更加简单，这里就不多解释了。</p>
<div class="articleText"><strong>3.2.2具有SSO功能的web应用源代码解析</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要实现WEB-SSO的功能，只有身份认证服务是不够的。这点很显然，要想使多个应用具有单点登录的功能，还需要每个应用本身的配合：将自己的身份认证的 服务交给一个统一的身份认证服务－SSOAuth。SSOAuth服务中提供的各个方法就是供每个加入SSO的Web应用来调用的。</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/202891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-26 13:26 <a href="http://www.blogjava.net/baoyaer/articles/202891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 超简单的 Web 爬虫程序</title><link>http://www.blogjava.net/baoyaer/articles/202889.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 26 May 2008 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/202889.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/202889.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/202889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/202889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/202889.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: /**&nbsp;*//**&nbsp;*&nbsp;@author&nbsp;Jack.Wang&nbsp;*&nbsp;&nbsp;*/import&nbsp;java.io.BufferedReader;import&nbsp;java.io.InputStreamReader;import&nbsp;java.net.URL;import&nbsp;java.u...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/202889.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/202889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-26 13:21 <a href="http://www.blogjava.net/baoyaer/articles/202889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java技术与Java虚拟机 </title><link>http://www.blogjava.net/baoyaer/articles/202886.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 26 May 2008 05:10:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/202886.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/202886.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/202886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/202886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/202886.html</trackback:ping><description><![CDATA[<br />
　　说起Java，人们首先想到的是<a href="http://www.qqread.com/z/p/java/index.html" target="_blank">Java编程</a>语言，然而事实上，Java是一种技术，它由四方面组成：Java编程语言、Java类<a href="http://www.qqread.com/keys/file-format/index.html" target="_blank">文件格式</a>、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示：<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><a href="http://www.qqread.com/ArtImage/20060214/pp5_1.gif" target="_blank"><img alt="Java虚拟机深入研究（图一）" src="http://www.qqread.com/ArtImage/20060214/pp5_1.gif" border="0" /></a><br />
            图1 Java四个方面的关系</div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　运行期环境代表着Java平台，开发人员编写Java代码(.java文件)，然后将之编译成字节码(.class文件)。最后字节码被装入内存，一旦字节码进入虚拟机，它就会被解释器解释执行，或者是被即时代码发生器有选择的转换成机器码执行。从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建，Java语言则是进入这个平台的通道，用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示：<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><a href="http://www.qqread.com/ArtImage/20060214/pp5_2.gif" target="_blank"><img alt="Java虚拟机深入研究（图二）" src="http://www.qqread.com/ArtImage/20060214/pp5_2.gif" width="590" border="0" /> <br />
            (点击查看原图)</a><br />
            </div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　在Java平台的结构中, 可以看出，Java虚拟机(JVM) 处在核心的位置，是程序与底层<a href="http://www.qqread.com/tag/1182/index.html" target="_blank">操作系统</a>和硬件无关的关键。它的下方是移植接口，移植接口由两部分组成：适配器和Java操作系统, 其中依赖于平台的部分称为适配器；JVM 通过移植接口在具体的平台和操作系统上实现；在JVM 的上方是Java的基本类库和扩展类库以及它们的API， 利用Java API编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离，从而实现了Java 的平台无关性。 <br />
<br />
　　那么到底什么是Java虚拟机(JVM)呢？通常我们谈论JVM时，我们的意思可能是： <br />
<br />
　　对JVM规范的的比较抽象的说明； <br />
　　对JVM的具体实现； <br />
　　在程序运行期间所生成的一个JVM实例。 <br />
<br />
　　对JVM规范的的抽象说明是一些概念的集合，它们已经在书《The Java Virtual Machine Specification》（《Java虚拟机规范》）中被详细地描述了；对JVM的具体实现要么是软件，要么是软件和硬件的组合，它已经被许多生产厂商所实现，并存在于多种平台之上；运行Java程序的任务由JVM的运行期实例单个承担。在本文中我们所讨论的Java虚拟机(JVM)主要针对第三种情况而言。它可以被看成一个想象中的机器，在实际的计算机上通过软件模拟来实现，有自己想象中的硬件，如处理器、堆栈、寄存器等，还有自己相应的指令系统。<br />
<br />
　　JVM在它的生存周期中有一个明确的任务，那就是运行Java程序，因此当Java程序启动的时候，就产生JVM的一个实例；当程序运行结束的时候，该实例也跟着消失了。下面我们从JVM的体系结构和它的运行过程这两个方面来对它进行比较深入的研究。<br />
<div class="line"></div>
<strong>Java虚拟机的体系结构</strong><br />
<br />
　　刚才已经提到，JVM可以由不同的厂商来实现。由于厂商的不同必然导致JVM在实现上的一些不同，然而JVM还是可以实现跨平台的特性，这就要归功于设计JVM时的体系结构了。<br />
<br />
　　我们知道，一个JVM实例的行为不光是它自己的事，还涉及到它的子系统、存储区域、数据类型和指令这些部分，它们描述了JVM的一个抽象的内部体系结构，其目的不光规定实现JVM时它内部的体系结构，更重要的是提供了一种方式，用于严格定义实现时的外部行为。每个JVM都有两种机制，一个是装载具有合适名称的类(类或是接口)，叫做类装载子系统；另外的一个负责执行包含在已装载的类或接口中的指令，叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈这五个部分，这几个部分和类装载机制与运行引擎机制一起组成的体系结构图为：<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><a href="http://www.qqread.com/ArtImage/20060214/pp5_3.gif" target="_blank"><img alt="Java虚拟机深入研究（图三）" src="http://www.qqread.com/ArtImage/20060214/pp5_3.gif" border="0" /></a><br />
            图3 JVM的体系结构<br />
            </div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　JVM的每个实例都有一个它自己的方法域和一个堆，运行于JVM内的所有的线程都共享这些区域；当虚拟机装载类文件的时候，它解析其中的二进制数据所包含的类信息，并把它们放到方法域中；当程序运行的时候，JVM把程序初始化的所有对象置于堆上；而每个线程创建的时候，都会拥有自己的程序计数器和Java栈，其中程序计数器中的值指向下一条即将被执行的指令，线程的Java栈则存储为该线程调用Java方法的状态；本地方法调用的状态被存储在本地方法栈，该方法栈依赖于具体的实现。<br />
<br />
　　下面分别对这几个部分进行说明。<br />
<br />
　　执行引擎处于JVM的核心位置，在Java虚拟机规范中，它的行为是由指令集所决定的。尽管对于每条指令，规范很详细地说明了当JVM执行字节码遇到指令时，它的实现应该做什么，但对于怎么做却言之甚少。Java虚拟机支持大约248个字节码。每个字节码执行一种基本的<a href="http://www.qqread.com/keys/cpu/index.html" target="_blank">CPU</a>运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的<a href="http://www.qqread.com/tag/1461/index.html" target="_blank">汇编语言</a>。<br />
<br />
　　Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。<br />
<br />
　　虚拟机的内层循环的执行过程如下: <br />
<br />
do{ <br />
取一个操作符字节; <br />
根据操作符的值执行一个动作; <br />
}while(程序未结束)<br />
<br />
　　由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为: <br />
<br />
　　第一个字节*256+第二个字节字节码。 <br />
<br />
　　指令流一般只是字节对齐的。指令tableswitch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。 <br />
<br />
　　对于本地方法接口，实现JVM并不要求一定要有它的支持，甚至可以完全没有。Sun公司实现Java本地接口(JNI)是出于可移植性的考虑，当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。但是这些设计与实现是比较复杂的事情，需要确保垃圾回收器不会将那些正在被本地方法调用的对象释放掉。 <br />
<br />
　　Java的堆是一个运行时数据区,类的实例(对象)从中分配空间，它的管理是由垃圾回收来负责的:不给程序员显式释放对象的能力。Java不规定具体使用的垃圾回收算法,可以根据系统的需求使用各种各样的算法。 <br />
<br />
　　Java方法区与传统语言中的编译后代码或是<a href="http://www.qqread.com/keys/unix/index.html" target="_blank">Unix</a>进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在垃圾回收堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码。可以说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。其具体细节请参考Sun公司的Java虚拟机规范。 <br />
<br />
　　Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。Java虚拟机的寄存器有四种: <br />
<br />
　　pc: Java程序计数器； <br />
　　optop: 指向操作数栈顶端的指针； <br />
　　frame: 指向当前执行方法的执行环境的指针；。 <br />
　　vars: 指向当前执行方法的局部变量区第一个变量的指针。 <br />
<br />
　　在上述体系结构图中，我们所说的是第一种，即程序计数器，每个线程一旦被创建就拥有了自己的程序计数器。当线程执行Java方法的时候，它包含该线程正在被执行的指令的地址。但是若线程执行的是一个本地的方法，那么程序计数器的值就不会被定义。 <br />
<br />
　　Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。<br />
<br />
　　局部变量区<br />
<br />
　　每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。<br />
<br />
　　运行环境区<br />
<br />
　　在运行环境中包含的信息用于动态链接,正常的方法返回以及异常捕捉。 <br />
<br />
　　动态链接 <br />
<br />
　　运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。 <br />
<br />
　　正常的方法返回 <br />
<br />
　　如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。 <br />
<br />
　　异常捕捉 <br />
<br />
　　异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个空指针的引用。程序使用了throw语句。 <br />
<br />
　　当异常发生时,Java虚拟机采取如下措施: <br />
<br />
　　检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。 <br />
<br />
　　与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。 <br />
<br />
　　由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。 <br />
<br />
　　如果找不到匹配的catch子句,那么当前方法得到一个"未截获异常"的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误将被传播下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。 <br />
<br />
　　操作数栈区<br />
<br />
　　机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。 <br />
<br />
　　每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符dupe和swap),用于对运行时数据区进行操作时是不考虑类型的。 <br />
<br />
　　本地方法栈，当一个线程调用本地方法时，它就不再受到虚拟机关于结构和安全限制方面的约束，它既可以访问虚拟机的运行期数据区，也可以使用本地处理器以及任何类型的栈。例如，本地栈是一个<a href="http://www.qqread.com/keywords/c-language.html" target="_blank">C语言</a>的栈，那么当C程序调用C函数时，函数的参数以某种顺序被压入栈，结果则返回给调用函数。在实现Java虚拟机时，本地方法接口使用的是C语言的模型栈，那么它的本地方法栈的调度与使用则完全与C语言的栈相同。<br />
<br />
<div class="line"></div>
<strong>Java虚拟机的运行过程</strong><br />
<br />
　　上面对虚拟机的各个部分进行了比较详细的说明，下面通过一个具体的例子来分析它的运行过程。<br />
<br />
　　虚拟机通过调用某个指定类的方法main启动，传递给main一个字符串数组参数，使指定的类被装载，同时链接该类所使用的其它的类型，并且初始化它们。例如对于程序：<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>class HelloApp <br />
            {<br />
            　public static void main(String[] args) <br />
            　{<br />
            　　System.out.println("Hello World!"); <br />
            　　for (int i = 0; i &lt; args.length; i++ )<br />
            　　{<br />
            　　　System.out.println(args[i]);<br />
            　　}<br />
            　}<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　编译后在命令行模式下键入： java HelloApp run virtual machine <br />
<br />
　　将通过调用HelloApp的方法main来启动java虚拟机，传递给main一个包含三个字符串"run"、"virtual"、"machine"的数组。现在我们略述虚拟机在执行HelloApp时可能采取的步骤。 <br />
<br />
　　开始试图执行类HelloApp的main方法，发现该类并没有被装载，也就是说虚拟机当前不包含该类的二进制代表，于是虚拟机使用ClassLoader试图寻找这样的二进制代表。如果这个<a href="http://www.qqread.com/z/windows/process/index.html" target="_blank">进程</a>失败，则抛出一个异常。类被装载后同时在main方法被调用之前，必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶段：检验，准备和解析。检验检查被装载的主类的符号和语义，准备则创建类或接口的静态域以及把这些域初始化为标准的默认值，解析负责检查主类对其它类或接口的符号引用，在这一步它是可选的。类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。整个过程如下：<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><a href="http://www.qqread.com/ArtImage/20060214/pp5_4.gif" target="_blank"><img alt="Java虚拟机深入研究（图四）" src="http://www.qqread.com/ArtImage/20060214/pp5_4.gif" width="590" border="0" /> <br />
            (点击查看原图)</a><br />
            图4：虚拟机的运行过程<br />
            </div>
            </td>
        </tr>
    </tbody>
</table>
　　<strong>结束语</strong><br />
<br />
　　本文通过对JVM的体系结构的深入研究以及一个Java程序执行时虚拟机的运行过程的详细分析，意在剖析清楚Java虚拟机的机理。 <br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/202886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-26 13:10 <a href="http://www.blogjava.net/baoyaer/articles/202886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java接口妙用</title><link>http://www.blogjava.net/baoyaer/articles/175377.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 15 Jan 2008 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/175377.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/175377.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/175377.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/175377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/175377.html</trackback:ping><description><![CDATA[1.回调<br />
下面这个代码是模仿spring的HibernateTemplae.excute(HibernateCallback callback)的
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;callback;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_43_77_Open_Image" onclick="this.style.display='none'; Codehighlighter1_43_77_Open_Text.style.display='none'; Codehighlighter1_43_77_Closed_Image.style.display='inline'; Codehighlighter1_43_77_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_43_77_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_43_77_Closed_Text.style.display='none'; Codehighlighter1_43_77_Open_Image.style.display='inline'; Codehighlighter1_43_77_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Callee&nbsp;</span><span id="Codehighlighter1_43_77_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_43_77_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;doExecute();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;callback;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_39_769_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_769_Open_Text.style.display='none'; Codehighlighter1_39_769_Closed_Image.style.display='inline'; Codehighlighter1_39_769_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_39_769_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_39_769_Closed_Text.style.display='none'; Codehighlighter1_39_769_Open_Image.style.display='inline'; Codehighlighter1_39_769_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Caller&nbsp;</span><span id="Codehighlighter1_39_769_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_39_769_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_84_528_Open_Image" onclick="this.style.display='none'; Codehighlighter1_84_528_Open_Text.style.display='none'; Codehighlighter1_84_528_Closed_Image.style.display='inline'; Codehighlighter1_84_528_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_84_528_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_84_528_Closed_Text.style.display='none'; Codehighlighter1_84_528_Open_Image.style.display='inline'; Codehighlighter1_84_528_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[])&nbsp;</span><span id="Codehighlighter1_84_528_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_84_528_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_127_312_Open_Image" onclick="this.style.display='none'; Codehighlighter1_127_312_Open_Text.style.display='none'; Codehighlighter1_127_312_Closed_Image.style.display='inline'; Codehighlighter1_127_312_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_127_312_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_127_312_Closed_Text.style.display='none'; Codehighlighter1_127_312_Open_Image.style.display='inline'; Codehighlighter1_127_312_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;CallerClass.execute(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Callee()&nbsp;</span><span id="Codehighlighter1_127_312_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_127_312_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_167_301_Open_Image" onclick="this.style.display='none'; Codehighlighter1_167_301_Open_Text.style.display='none'; Codehighlighter1_167_301_Closed_Image.style.display='inline'; Codehighlighter1_167_301_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_167_301_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_167_301_Closed_Text.style.display='none'; Codehighlighter1_167_301_Open_Image.style.display='inline'; Codehighlighter1_167_301_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">public</span><span style="color: #000000">&nbsp;Object&nbsp;doExecute()&nbsp;</span><span id="Codehighlighter1_167_301_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_167_301_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;String&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">this&nbsp;is&nbsp;callback&nbsp;runing</span><span style="color: #000000">"</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;System.out.println(s);<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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><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/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_363_519_Open_Image" onclick="this.style.display='none'; Codehighlighter1_363_519_Open_Text.style.display='none'; Codehighlighter1_363_519_Closed_Image.style.display='inline'; Codehighlighter1_363_519_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_363_519_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_363_519_Closed_Text.style.display='none'; Codehighlighter1_363_519_Open_Image.style.display='inline'; Codehighlighter1_363_519_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;CallerClass.execute(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Callee()&nbsp;</span><span id="Codehighlighter1_363_519_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_363_519_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_403_508_Open_Image" onclick="this.style.display='none'; Codehighlighter1_403_508_Open_Text.style.display='none'; Codehighlighter1_403_508_Closed_Image.style.display='inline'; Codehighlighter1_403_508_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_403_508_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_403_508_Closed_Text.style.display='none'; Codehighlighter1_403_508_Open_Image.style.display='inline'; Codehighlighter1_403_508_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">public</span><span style="color: #000000">&nbsp;Object&nbsp;doExecute()&nbsp;</span><span id="Codehighlighter1_403_508_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_403_508_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;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">i&nbsp;am&nbsp;can</span><span style="color: #000000">"</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">2234234</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/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.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/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_566_767_Open_Image" onclick="this.style.display='none'; Codehighlighter1_566_767_Open_Text.style.display='none'; Codehighlighter1_566_767_Closed_Image.style.display='inline'; Codehighlighter1_566_767_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_566_767_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_566_767_Closed_Text.style.display='none'; Codehighlighter1_566_767_Open_Image.style.display='inline'; Codehighlighter1_566_767_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CallerClass&nbsp;</span><span id="Codehighlighter1_566_767_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_566_767_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_618_761_Open_Image" onclick="this.style.display='none'; Codehighlighter1_618_761_Open_Text.style.display='none'; Codehighlighter1_618_761_Closed_Image.style.display='inline'; Codehighlighter1_618_761_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_618_761_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_618_761_Closed_Text.style.display='none'; Codehighlighter1_618_761_Open_Image.style.display='inline'; Codehighlighter1_618_761_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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;execute(Callee&nbsp;callee)&nbsp;</span><span id="Codehighlighter1_618_761_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_618_761_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;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">call&nbsp;back&nbsp;start</span><span style="color: #000000">"</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;callee.doExecute();<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;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">call&nbsp;back&nbsp;done</span><span style="color: #000000">"</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;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
运行结果：<br />
call back start<br />
this is callback runing<br />
call back done<br />
call back start<br />
i am can<br />
call back done<br />
<br />
<br />
2: 有时候，每个类的实例只在某个地方用到，其它地方不会去调用，我们可以把这个实例放到某个函数内部调用
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_54_336_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_336_Open_Text.style.display='none'; Codehighlighter1_54_336_Closed_Image.style.display='inline'; Codehighlighter1_54_336_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_54_336_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_54_336_Closed_Text.style.display='none'; Codehighlighter1_54_336_Open_Image.style.display='inline'; Codehighlighter1_54_336_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;File[]&nbsp;listSubDirectories(String&nbsp;_dir)&nbsp;</span><span id="Codehighlighter1_54_336_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_54_336_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;File&nbsp;fDir&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(_dir);<br />
<img id="Codehighlighter1_141_255_Open_Image" onclick="this.style.display='none'; Codehighlighter1_141_255_Open_Text.style.display='none'; Codehighlighter1_141_255_Closed_Image.style.display='inline'; Codehighlighter1_141_255_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_141_255_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_141_255_Closed_Text.style.display='none'; Codehighlighter1_141_255_Open_Image.style.display='inline'; Codehighlighter1_141_255_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;FileFilter&nbsp;fileFilter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileFilter()&nbsp;</span><span id="Codehighlighter1_141_255_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_141_255_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_188_245_Open_Image" onclick="this.style.display='none'; Codehighlighter1_188_245_Open_Text.style.display='none'; Codehighlighter1_188_245_Closed_Image.style.display='inline'; Codehighlighter1_188_245_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_188_245_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_188_245_Closed_Text.style.display='none'; Codehighlighter1_188_245_Open_Image.style.display='inline'; Codehighlighter1_188_245_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">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;accept(File&nbsp;file)&nbsp;</span><span id="Codehighlighter1_188_245_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_188_245_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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;file.isDirectory();<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/ExpandedSubBlockEnd.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/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File[]&nbsp;files&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fDir.listFiles(fileFilter);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;files;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/175377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-15 10:05 <a href="http://www.blogjava.net/baoyaer/articles/175377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程编程——实战篇</title><link>http://www.blogjava.net/baoyaer/articles/172526.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 03 Jan 2008 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/172526.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/172526.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/172526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/172526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/172526.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [多线程编程的一般原则]在进入实战篇以前,我们简单说一下多线程编程的一般原则。 　　[安全性]是多线程编程的首要原则，如果两个以上的线程访问同一对象时，一个线程会损坏另一个线程的数据，这就是违反了安全性原则，这样的程序是不能进入实际应用的。　　安全性的保证可以通过设计安全的类和程序员的手工控制。如果多个线程对同一对象访问不会危及安全性，这样的类就是线程安全的类，在JAVA中比如Stri...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/172526.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/172526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-03 17:38 <a href="http://www.blogjava.net/baoyaer/articles/172526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Junit  结合spring+hibernate框架</title><link>http://www.blogjava.net/baoyaer/articles/168752.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 19 Dec 2007 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/168752.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/168752.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/168752.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/168752.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/168752.html</trackback:ping><description><![CDATA[<p>spring + hibernate的Junit测试框架： </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test.trs;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;junit.framework.TestCase;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.ApplicationContext;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.support.FileSystemXmlApplicationContext;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.core.io.FileSystemResource;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_287_755_Open_Image" onclick="this.style.display='none'; Codehighlighter1_287_755_Open_Text.style.display='none'; Codehighlighter1_287_755_Closed_Image.style.display='inline'; Codehighlighter1_287_755_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_287_755_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_287_755_Closed_Text.style.display='none'; Codehighlighter1_287_755_Open_Image.style.display='inline'; Codehighlighter1_287_755_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DreamFactoryTest&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;TestCase&nbsp;</span><span id="Codehighlighter1_287_755_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_287_755_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;ApplicationContext&nbsp;factory;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_377_647_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_647_Open_Text.style.display='none'; Codehighlighter1_377_647_Closed_Image.style.display='inline'; Codehighlighter1_377_647_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_377_647_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_377_647_Closed_Text.style.display='none'; Codehighlighter1_377_647_Open_Image.style.display='inline'; Codehighlighter1_377_647_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUp()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_377_647_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_647_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_417_574_Open_Image" onclick="this.style.display='none'; Codehighlighter1_417_574_Open_Text.style.display='none'; Codehighlighter1_417_574_Closed_Image.style.display='inline'; Codehighlighter1_417_574_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_417_574_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_417_574_Closed_Text.style.display='none'; Codehighlighter1_417_574_Open_Image.style.display='inline'; Codehighlighter1_417_574_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;String&nbsp;[]location</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[]</span><span id="Codehighlighter1_417_574_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_417_574_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;</span><span style="color: #000000">"</span><span style="color: #000000">D:/workspace/EmailSubScribe/webapp/WEB-INF/beans.xml</span><span style="color: #000000">"</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 style="color: #000000">"</span><span style="color: #000000">D:/workspace/EmailSubScribe/webapp/WEB-INF/applicationContext.xml</span><span style="color: #000000">"</span><span style="color: #000000">}</span></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;factory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileSystemXmlApplicationContext(location);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_697_752_Open_Image" onclick="this.style.display='none'; Codehighlighter1_697_752_Open_Text.style.display='none'; Codehighlighter1_697_752_Closed_Image.style.display='inline'; Codehighlighter1_697_752_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_697_752_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_697_752_Closed_Text.style.display='none'; Codehighlighter1_697_752_Open_Image.style.display='inline'; Codehighlighter1_697_752_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;tearDown()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_697_752_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_697_752_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;factory</span><span style="color: #000000">=</span><span style="color: #0000ff">null</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;</span><span style="color: #0000ff">super</span><span style="color: #000000">.tearDown();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
继承的子类<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test.trs.db.impl;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;test.trs.DreamFactoryTest;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.trs.db.dao.WebSiteConfigDao;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.trs.db.persistent.WebSiteConfig;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_207_462_Open_Image" onclick="this.style.display='none'; Codehighlighter1_207_462_Open_Text.style.display='none'; Codehighlighter1_207_462_Closed_Image.style.display='inline'; Codehighlighter1_207_462_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_207_462_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_207_462_Closed_Text.style.display='none'; Codehighlighter1_207_462_Open_Image.style.display='inline'; Codehighlighter1_207_462_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;WebSiteConfigImplTest&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;DreamFactoryTest&nbsp;</span><span id="Codehighlighter1_207_462_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_207_462_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;WebSiteConfigDao&nbsp;manager;<br />
<img id="Codehighlighter1_299_400_Open_Image" onclick="this.style.display='none'; Codehighlighter1_299_400_Open_Text.style.display='none'; Codehighlighter1_299_400_Closed_Image.style.display='inline'; Codehighlighter1_299_400_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_299_400_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_299_400_Closed_Text.style.display='none'; Codehighlighter1_299_400_Open_Image.style.display='inline'; Codehighlighter1_299_400_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUp()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_299_400_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_299_400_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;</span><span style="color: #0000ff">super</span><span style="color: #000000">.setUp();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manager</span><span style="color: #000000">=</span><span style="color: #000000">(WebSiteConfigDao)factory.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">WebSiteConfigDao</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_439_457_Open_Image" onclick="this.style.display='none'; Codehighlighter1_439_457_Open_Text.style.display='none'; Codehighlighter1_439_457_Closed_Image.style.display='inline'; Codehighlighter1_439_457_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_439_457_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_439_457_Closed_Text.style.display='none'; Codehighlighter1_439_457_Open_Image.style.display='inline'; Codehighlighter1_439_457_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;testCascadeDelete()&nbsp;</span><span id="Codehighlighter1_439_457_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_439_457_Open_Text"><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;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/168752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-19 14:52 <a href="http://www.blogjava.net/baoyaer/articles/168752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat6.0   ||  5.5 中数据源的配置 </title><link>http://www.blogjava.net/baoyaer/articles/167442.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 13 Dec 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/167442.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/167442.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/167442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/167442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/167442.html</trackback:ping><description><![CDATA[<strong style="color: red">Tomcat6.0&nbsp;:</strong><br />
<br />
&nbsp;在$CATALINA_HOME/conf/server.xml文件中的&lt;Host&gt;&lt;/Host&gt;标签之间加入如下的Context代码<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Context&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/articlesystem"</span><span style="color: #ff0000">&nbsp;docBase</span><span style="color: #0000ff">="articlesystem"</span><span style="color: #ff0000">&nbsp;debug</span><span style="color: #0000ff">="5"</span><span style="color: #ff0000">&nbsp;reloadable</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;crossContext</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Resource&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/StrutsArticle"</span><span style="color: #ff0000">&nbsp;auth</span><span style="color: #0000ff">="Container"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="javax.sql.DataSource"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxActive</span><span style="color: #0000ff">="100"</span><span style="color: #ff0000">&nbsp;maxIdle</span><span style="color: #0000ff">="30"</span><span style="color: #ff0000">&nbsp;maxWait</span><span style="color: #0000ff">="10000"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username</span><span style="color: #0000ff">="root"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="root"</span><span style="color: #ff0000">&nbsp;driverClassName</span><span style="color: #0000ff">="com.mysql.jdbc.Driver"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url</span><span style="color: #0000ff">="jdbc:mysql://localhost:3306/strutsaritclecharacterEncoding=GBK&amp;amp;useUnicode=TRUE&amp;amp;autoReconnect=true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Context</span><span style="color: #0000ff">&gt;</span></div>
<span style="color: red">注意要把这段代码配置到Host&gt;&lt;/Host&gt;标签之间。<br />
</span><br />
完成以上工作后，数据库就配置成功了。。也不必像官方文档说的那样在、在web应用的web.xml中配置&lt;resource-ref&gt;标签的属性了。<br />
<p>另. Context元素代表一个web应用，运行在某个特定的虚拟主机上。你可以在一个Host元素中嵌套任意多的Context元素。每个Context的路径必须是惟一的，由path属性定义。</p>
<p>所有Context的实现支持如下属性：<br />
<br />
<table cellpadding="5" border="1">
    <tbody>
        <tr>
            <th width="15%" bgcolor="#023264"><font color="#ffffff">属性</font></th>
            <th width="75%" bgcolor="#023264"><font color="#ffffff">描述</font></th>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">backgroundProcessorDelay</font></code></td>
            <td valign="top" align="left"><code><font face="新宋体">这个</font></code>值代表在context及其子容器（包括所有的wrappers）上调用backgroundProcess方法的延时，以秒为单位。如果延时值非负，子容器不会被调用，也就是说子容器使用自己的处理线程。如果该值为正，会创建一个新的线程。在等待指定的时间以后，该线程在主机及其 子容器上调用backgroundProcess方法。context利用后台处理session过期，监测类的变化用于重新载入。如果没有指定，该属性的缺省值是－1，说明context依赖其所属的Host的后台处理。</td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">className</font></code></td>
            <td valign="top" align="left">实现的Java类名。该类必须实现<code><font face="新宋体">org.apache.catalina.Context</font></code>接口。如果没有指定，使用标准实现（在下面定义）。</td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">cookies</font></code></td>
            <td valign="top" align="left">
            <p>如果想利用cookies来传递session identifier（需要客户端支持cookies），设为ture。否则为false，这种情况下只能依靠URL Rewriting传递session identifier。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">crossContext</font></code></td>
            <td valign="top" align="left">
            <p>如果想在应用内调用ServletContext.getContext()来返回在该虚拟主机上运行的其他web application的request dispatcher,设为true。在安全性很重要的环境中，设为false，使得getContext()总是返回null。缺省值为false。</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">docBase</font></code></td>
            <td valign="middle" align="left">
            <p>该web应用的文档基准目录（Document Base，也称为Context Root），或者是WAR文件的路径。可以使用绝对路径，也可以使用相对于context所属的Host的appBase路径。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">override</font></code></td>
            <td valign="middle" align="left">
            <p>如果想利用该Context元素中的设置覆盖DefaultContext中相应的设置，设为true。缺省情况下使用DefaultContext中的设置。</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">privileged</font></code></td>
            <td valign="middle" align="left">
            <p>设为true，允许context使用container servlets，比如manager servlet。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">path</font></code></td>
            <td valign="top" align="left">
            <p>web应用的context路径。catalina将每个URL的起始和context path进行比较，选择合适的web应用处理该请求。特定Host下的context path必须是惟一的。如果context path为空字符串（""），这个context是所属Host的缺省web应用,用来处理不能匹配任何context path的请求。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">reloadable</font></code></td>
            <td valign="top" align="left">如果希望Catalina监视/WEB-INF/classes/和/WEB-INF/lib下面的类是否发生变化，在发生变化的时候自动重载web application，设为true。这个特征在开发阶段很有用，但也大大增加了服务器的开销。因此，在发布以后，不推荐使用。但是，你可以使用Manager应用在必要的时候触发应用的重载。</td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">wrapperClass</font></code></td>
            <td valign="middle" align="left">
            <p>org.apache.catalina.Wrapper实现类的名称，用于该Context管理的servlets。如果没有指定，使用标准的缺省值。</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
&nbsp;java代码得到连接:<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;Context&nbsp;initCtx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InitialContext();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;ctx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Context)initCtx.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">java:comp/env</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;&nbsp;Object&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Object)&nbsp;ctx.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">jdbc/sqlserver</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;&nbsp;javax.sql.DataSource&nbsp;ds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(javax.sql.DataSource)obj;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ds.getConnection();</span></div>
<br />
<br />
&nbsp;Hibernate得到连接:<br />
<br />
在hibernate-cfg.xml中<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="connection.datasource"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">java:comp/env/jdbc/sqlserver</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
&nbsp;Spring中得到连接:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.jndi.JndiObjectFactoryBean"</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jndiName"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">java:comp/env/jdbc/dermis</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span></div>
<br />
<p>&nbsp;如果你用的是jboss服务器:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把java:comp/env 改成java:就足够了</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你用的是apache的dbcp包:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.type="org.apache.commons.dbcp.BasicDataSouce"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.driverClassName="net.sourceforge.jtds.jdbc.Driver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.url="jdbc:jtds:sqlserver://127.0.0.1:1433/dataBasename"</p>
<p>&nbsp;如果你用的是MySQL:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.driverClassName="com.mysql.jdbc.Driver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.url="jdbc:mysql://127.0.0.1:3306/dbname"<br />
&nbsp;如果是Oracle:<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.driverClassName="oracel.jdbc.driver.OracleDriver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.url="jdbc:oracle:thin://127.0.0.1:1521/dbname"&nbsp; </p>
<span style="color: red">Tomcat 5.5<br />
<p>首先编辑Server.xml，添加数据源代码<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">Context&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/StudentManager"</span><span style="color: #ff0000">&nbsp;docbase</span><span style="color: #0000ff">="StudentManager"</span><span style="color: #ff0000">&nbsp;debug</span><span style="color: #0000ff">="5"</span><span style="color: #ff0000">&nbsp;reload</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;crossContext</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</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;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Resource&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/StudentManager"</span><span style="color: #ff0000">&nbsp;auth</span><span style="color: #0000ff">="Container"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="javax.sql.DataSource"</span><span style="color: #0000ff">/&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ResourceParams&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/StudentManager"</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">factory</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.commons.dbcp.BasicDataSourceFactory</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">url</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jdbc:mysql://localhost:3306/studentmanager</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">driverclassname</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.mysql.jdbc.Driver</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">username</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">root</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">password</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">root</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">maxWait</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">3000</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">maxIdle</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">10</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">maxActive</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">100</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><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;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ResourceParams</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Context</span><span style="color: #0000ff">&gt;</span></div>
<p>在Web.xml中加入对jndi的引用<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">resource-ref</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">SqlServer&nbsp;&nbsp;&nbsp;Datasource&nbsp;&nbsp;&nbsp;example</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-ref-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jdbc/StudentManager</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-ref-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javax.sql.DataSource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Container</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">resource-ref</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;</p>
<p>测试代码：</p>
<p><br />
&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_2_664_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_664_Open_Text.style.display='none'; Codehighlighter1_2_664_Closed_Image.style.display='inline'; Codehighlighter1_2_664_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2_664_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2_664_Closed_Text.style.display='none'; Codehighlighter1_2_664_Open_Image.style.display='inline'; Codehighlighter1_2_664_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_2_664_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_2_664_Open_Text"><span style="color: #000000; background-color: #f5f5f5"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;jndi</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java:comp/env/jdbc/StudentManager</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;initCtx</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;InitialContext();&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">//</span><span style="color: #000000; background-color: #f5f5f5">初始化上下文，可以读配置文件如：web.xml&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5">(initCtx</span><span style="color: #000000; background-color: #f5f5f5">==</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">)&nbsp;&nbsp;&nbsp;<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;throw&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;Exception(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">Initial&nbsp;&nbsp;&nbsp;Failed!</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;ctx</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">(Context)initCtx.lookup(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java:comp/env</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5">(ctx!</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">)&nbsp;&nbsp;&nbsp;<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;ds</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">(DataSource)ctx.lookup(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">jdbc/StudentManager</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5">(ds</span><span style="color: #000000; background-color: #f5f5f5">==</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">)&nbsp;&nbsp;&nbsp;<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;throw&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;Exception(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">Look&nbsp;&nbsp;&nbsp;up&nbsp;&nbsp;&nbsp;DataSource&nbsp;&nbsp;&nbsp;Failed!</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;catch(Exception&nbsp;e)<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ds);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span></div>
<p><br />
&nbsp;</p>
</span>
<img src ="http://www.blogjava.net/baoyaer/aggbug/167442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-13 11:08 <a href="http://www.blogjava.net/baoyaer/articles/167442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Java实现随机验证码功能实例 </title><link>http://www.blogjava.net/baoyaer/articles/167383.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 13 Dec 2007 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/167383.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/167383.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/167383.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/167383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/167383.html</trackback:ping><description><![CDATA[现在许多系统的注册、登录或者发布信息模块都添加的随机码功能，就是为了避免自动注册程序或者自动发布程序的使用。 <br />
<br />
验证码实际上就是随机选择一些字符以图片的形式展现在页面上，如果进行提交操作的同时需要将图片上的字符同时提交，如果提交的字符与服务器session保存的不同，则认为提交信息无效。为了避免自动程序分析解析图片，通常会在图片上随机生成一些干扰线或者将字符进行扭曲，增加自动识别的难度。 <br />
<br />
在这里，我们使用servlet来实现随机验证码的实现。 <br />
<br />
package com.servlet; <br />
<br />
import java.awt.Color; <br />
import java.awt.Font; <br />
import java.awt.Graphics2D; <br />
import java.awt.image.BufferedImage; <br />
import java.util.Random; <br />
<br />
import javax.imageio.ImageIO; <br />
import javax.servlet.ServletException; <br />
import javax.servlet.ServletOutputStream; <br />
import javax.servlet.http.HttpServlet; <br />
import javax.servlet.http.HttpServletRequest; <br />
import javax.servlet.http.HttpServletResponse; <br />
import javax.servlet.http.HttpSession; <br />
<br />
/**<br />
* 生成随机验证码<br />
* @author bitiliu<br />
*<br />
*/<br />
public class ValidateCodeServlet extends HttpServlet <br />
{<br />
<br />
private static final long serialVersionUID = 1L; <br />
<br />
//验证码图片的宽度。<br />
private int width=60; <br />
//验证码图片的高度。<br />
private int height=20; <br />
//验证码字符个数<br />
private int codeCount=4; <br />
<br />
<br />
private int x=0; <br />
//字体高度<br />
private int fontHeight; <br />
private int codeY; <br />
<br />
char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',<br />
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',<br />
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; <br />
<br />
/**<br />
* 初始化验证图片属性<br />
*/<br />
public void init() throws ServletException<br />
{<br />
//从web.xml中获取初始信息<br />
//宽度<br />
String strWidth=this.getInitParameter("width"); <br />
//高度<br />
String strHeight=this.getInitParameter("height"); <br />
//字符个数<br />
String strCodeCount=this.getInitParameter("codeCount"); <br />
<br />
//将配置的信息转换成数值<br />
try<br />
{<br />
if(strWidth!=null &amp;&amp; strWidth.length()!=0)<br />
{<br />
width=Integer.parseInt(strWidth); <br />
}<br />
if(strHeight!=null &amp;&amp; strHeight.length()!=0)<br />
{<br />
height=Integer.parseInt(strHeight); <br />
}<br />
if(strCodeCount!=null &amp;&amp; strCodeCount.length()!=0)<br />
{<br />
codeCount=Integer.parseInt(strCodeCount); <br />
}<br />
}<br />
catch(NumberFormatException e)<br />
{}<br />
<br />
x=width/(codeCount+1); <br />
fontHeight=height-2; <br />
codeY=height-4; <br />
<br />
}<br />
<br />
protected void service(HttpServletRequest req, HttpServletResponse resp)<br />
throws ServletException, java.io.IOException {<br />
<br />
//定义图像buffer<br />
BufferedImage buffImg = new BufferedImage(<br />
width, height,BufferedImage.TYPE_INT_RGB); <br />
Graphics2D g = buffImg.createGraphics(); <br />
<br />
//创建一个随机数生成器类<br />
Random random = new Random(); <br />
<br />
//将图像填充为白色<br />
g.setColor(Color.WHITE); <br />
g.fillRect(0, 0, width, height); <br />
<br />
//创建字体，字体的大小应该根据图片的高度来定。<br />
Font font = new Font("Fixedsys", Font.PLAIN, fontHeight); <br />
//设置字体。<br />
g.setFont(font); <br />
<br />
//画边框。<br />
g.setColor(Color.BLACK); <br />
g.drawRect(0, 0, width - 1, height - 1); <br />
<br />
//随机产生160条干扰线，使图象中的认证码不易被其它程序探测到。<br />
g.setColor(Color.BLACK); <br />
for(int i = 0; i ＜ 160; i++) <br />
{<br />
int x = random.nextInt(width); <br />
int y = random.nextInt(height); <br />
int xl = random.nextInt(12); <br />
int yl = random.nextInt(12); <br />
g.drawLine(x, y, x + xl, y + yl); <br />
}<br />
<br />
//randomCode用于保存随机产生的验证码，以便用户登录后进行验证。<br />
StringBuffer randomCode = new StringBuffer(); <br />
int red = 0, green = 0, blue = 0; <br />
<br />
//随机产生codeCount数字的验证码。<br />
for (int i = 0; i ＜ codeCount; i++) {<br />
//得到随机产生的验证码数字。<br />
String strRand = String.valueOf(codeSequence[random.nextInt(36)]); <br />
//产生随机的颜色分量来构造颜色值，这样输出的每位数字的颜色值都将不同。<br />
red = random.nextInt(255); <br />
green = random.nextInt(255); <br />
blue = random.nextInt(255); <br />
<br />
//用随机产生的颜色将验证码绘制到图像中。<br />
g.setColor(new Color(red, green, blue)); <br />
g.drawString(strRand, (i + 1) * x, codeY); <br />
<br />
//将产生的四个随机数组合在一起。<br />
randomCode.append(strRand); <br />
}<br />
// 将四位数字的验证码保存到Session中。<br />
HttpSession session = req.getSession(); <br />
session.setAttribute("validateCode", randomCode.toString()); <br />
<br />
// 禁止图像缓存。<br />
resp.setHeader("Pragma", "no-cache"); <br />
resp.setHeader("Cache-Control", "no-cache"); <br />
resp.setDateHeader("Expires", 0); <br />
<br />
resp.setContentType("image/jpeg"); <br />
<br />
//将图像输出到Servlet输出流中。<br />
ServletOutputStream sos = resp.getOutputStream(); <br />
ImageIO.write(buffImg, "jpeg", sos); <br />
sos.close(); <br />
}<br />
<br />
} <br />
<br />
需要在web.xml中声明servlet <br />
<br />
＜servlet＞ <br />
＜servlet-name＞ValidateCodeServlet＜/servlet-name＞ <br />
＜servlet-class＞com.servlet.ValidateCodeServlet＜/servlet-class＞ <br />
＜init-param＞ <br />
＜param-name＞width＜/param-name＞ <br />
＜param-value＞200＜/param-value＞ <br />
＜/init-param＞ <br />
＜init-param＞ <br />
＜param-name＞height＜/param-name＞ <br />
＜param-value＞80＜/param-value＞ <br />
＜/init-param＞ <br />
＜init-param＞ <br />
＜param-name＞codeCount＜/param-name＞ <br />
＜param-value＞5＜/param-value＞ <br />
＜/init-param＞ <br />
＜/servlet＞ <br />
<br />
＜servlet-mapping＞ <br />
＜servlet-name＞ValidateCodeServlet＜/servlet-name＞ <br />
＜url-pattern＞/validateCodeServlet＜/url-pattern＞ <br />
＜/servlet-mapping＞ <br />
<br />
用户提交后就可以将用户输入的验证码与session中保存的字符串进行比对，达到验证的效果。<br />
 <img src ="http://www.blogjava.net/baoyaer/aggbug/167383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-13 09:18 <a href="http://www.blogjava.net/baoyaer/articles/167383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>排序算法复习（Java实现）(一）： 插入，冒泡，选择，Shell,快速排序 </title><link>http://www.blogjava.net/baoyaer/articles/167380.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 13 Dec 2007 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/167380.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/167380.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/167380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/167380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/167380.html</trackback:ping><description><![CDATA[<div class="postText">为了便于管理，先引入个基础类：<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;algorithms;<br />
<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;</span><span style="color: rgb(128,128,128)">@author</span><span style="color: rgb(0,128,0)">&nbsp;yovn<br />
&nbsp;*<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">abstract</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Sorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Comparable</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;&gt;</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">abstract</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sort(E[]&nbsp;array,</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from&nbsp;,</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;len);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">final</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sort(E[]&nbsp;array)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(array,</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">,array.length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">protected</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">final</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;swap(E[]&nbsp;array,</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from&nbsp;,</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;to)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;tmp</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[from];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[from]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[to];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[to]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">tmp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
一 插入排序<br />
该算法在数据规模小的时候十分高效，该算法每次插入第K+1到前K个有序数组中一个合适位置，K从0开始到N-1,从而完成排序：<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;algorithms;<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;</span><span style="color: rgb(128,128,128)">@author</span><span style="color: rgb(0,128,0)">&nbsp;yovn<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;InsertSorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Comparable</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Sorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)">&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;algorithms.Sorter#sort(E[],&nbsp;int,&nbsp;int)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sort(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;len)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;tmp</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">null</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">;i</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">len;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)<br />
&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;tmp</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;j</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(;j</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">from;j</span><span style="color: rgb(0,0,0)">--</span><span style="color: rgb(0,0,0)">)<br />
&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;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(tmp.compareTo(array[j</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">])</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[j]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[j</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">break</span><span style="color: rgb(0,0,0)">;<br />
&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;array[j]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">tmp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
}</span></div>
<br />
二 冒泡排序<br />
这可能是最简单的排序算法了，算法思想是每次从数组末端开始比较相邻两元素，把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。（当然也可以从数组开始端开始比较相邻两元素，把第i大的冒泡到数组的第N-i个位置。i从0一直到N-1从而完成排序。)<br />
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;algorithms;<br />
<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;</span><span style="color: rgb(128,128,128)">@author</span><span style="color: rgb(0,128,0)">&nbsp;yovn<br />
&nbsp;*<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;BubbleSorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Comparable</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Sorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">static</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">boolean</span><span style="color: rgb(0,0,0)">&nbsp;DWON</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">true</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">final</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;bubble_down(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">from;i</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">len;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)<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: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;j</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">len</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">;j</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">i;j</span><span style="color: rgb(0,0,0)">--</span><span style="color: rgb(0,0,0)">)<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: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(array[j].compareTo(array[j</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">])</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">)<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;swap(array,j</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">,j);<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;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">final</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;bubble_up(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">len</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">;i</span><span style="color: rgb(0,0,0)">&gt;=</span><span style="color: rgb(0,0,0)">from;i</span><span style="color: rgb(0,0,0)">--</span><span style="color: rgb(0,0,0)">)<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: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;j</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">from;j</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">i;j</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)<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: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(array[j].compareTo(array[j</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">])</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">)<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;swap(array,j,j</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">);<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;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sort(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;len)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(DWON)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bubble_down(array,from,len);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bubble_up(array,from,len);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
三，选择排序<br />
选择排序相对于冒泡来说，它不是每次发现逆序都交换，而是在找到全局第i小的时候记下该元素位置，最后跟第i个元素交换，从而保证数组最终的有序。<br />
相对与插入排序来说，选择排序每次选出的都是全局第i小的，不会调整前i个元素了。<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;algorithms;<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;</span><span style="color: rgb(128,128,128)">@author</span><span style="color: rgb(0,128,0)">&nbsp;yovn<br />
&nbsp;*<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;SelectSorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Comparable</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Sorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)">&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;algorithms.Sorter#sort(E[],&nbsp;int,&nbsp;int)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sort(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;len)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;i</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">len;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)<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: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;smallest</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;j</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">i</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">from;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(;j</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">len;j</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)<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: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(array[j].compareTo(array[smallest])</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">)<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;smallest</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">j;<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;&nbsp;&nbsp;&nbsp;&nbsp;swap(array,i,smallest);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp; <br />
}<br />
</span></div>
四 Shell排序<br />
Shell排序可以理解为插入排序的变种，它充分利用了插入排序的两个特点：<br />
1）当数据规模小的时候非常高效<br />
2）当给定数据已经有序时的时间代价为O(N)<br />
所以，Shell排序每次把数据分成若个小块，来使用插入排序，而且之后在这若个小块排好序的情况下把它们合成大一点的小块，继续使用插入排序，不停的合并小块，知道最后成一个块，并使用插入排序。<br />
<br />
这里每次分成若干小块是通过&#8220;增量&#8221; 来控制的，开始时增量交大，接近N/2,从而使得分割出来接近N/2个小块，逐渐的减小&#8220;增量&#8220;最终到减小到1。<br />
<br />
一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)<br />
所以我在实现Shell排序的时候采用该增量序列<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;algorithms;<br />
<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;</span><span style="color: rgb(128,128,128)">@author</span><span style="color: rgb(0,128,0)">&nbsp;yovn<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;ShellSorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Comparable</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Sorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)">&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Our&nbsp;delta&nbsp;value&nbsp;choose&nbsp;2^k-1,2^(k-1)-1,<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" />.7,3,1.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;complexity&nbsp;is&nbsp;O(n^1.5)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;algorithms.Sorter#sort(E[],&nbsp;int,&nbsp;int)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sort(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;len)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">1.calculate&nbsp;&nbsp;the&nbsp;first&nbsp;delta&nbsp;value;</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;value</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">while</span><span style="color: rgb(0,0,0)">((value</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">)</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">len)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">(value</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">)</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;delta</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">value;delta</span><span style="color: rgb(0,0,0)">&gt;=</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">;delta</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">(delta</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">)</span><span style="color: rgb(0,0,0)">/</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">)<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: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;i</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">delta;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)<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;modify_insert_sort(array,from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">i,len</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">i,delta);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">final</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;modify_insert_sort(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;len,</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;delta)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(len</span><span style="color: rgb(0,0,0)">&lt;=</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">)</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;tmp</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">null</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">delta;i</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">len;i</span><span style="color: rgb(0,0,0)">+=</span><span style="color: rgb(0,0,0)">delta)<br />
&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;tmp</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;j</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">(;j</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">from;j</span><span style="color: rgb(0,0,0)">-=</span><span style="color: rgb(0,0,0)">delta)<br />
&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;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(tmp.compareTo(array[j</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">delta])</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[j]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[j</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">delta];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">break</span><span style="color: rgb(0,0,0)">;<br />
&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;array[j]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">tmp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
五 快速排序<br />
快速排序是目前使用可能最广泛的排序算法了。<br />
一般分如下步骤：<br />
1）选择一个枢纽元素（有很对选法，我的实现里采用去中间元素的简单方法）<br />
2）使用该枢纽元素分割数组，使得比该元素小的元素在它的左边，比它大的在右边。并把枢纽元素放在合适的位置。<br />
3）根据枢纽元素最后确定的位置，把数组分成三部分，左边的，右边的，枢纽元素自己，对左边的，右边的分别递归调用快速排序算法即可。<br />
快速排序的核心在于分割算法，也可以说是最有技巧的部分。<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;algorithms;<br />
<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;</span><span style="color: rgb(128,128,128)">@author</span><span style="color: rgb(0,128,0)">&nbsp;yovn<br />
&nbsp;*<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;QuickSorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Comparable</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;Sorter</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">E</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)">&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;algorithms.Sorter#sort(E[],&nbsp;int,&nbsp;int)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sort(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;len)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_sort(array,from,from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">len</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">final</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;q_sort(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;to)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(to</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">from</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">)</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;pivot</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">selectPivot(array,from,to);<br />
<br />
&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;pivot</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">partion(array,from,to,pivot);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_sort(array,from,pivot</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_sort(array,pivot</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">,to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;partion(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;to,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;pivot)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;tmp</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[pivot];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[pivot]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[to];</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">now&nbsp;to's&nbsp;position&nbsp;is&nbsp;available</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">while</span><span style="color: rgb(0,0,0)">(from</span><span style="color: rgb(0,0,0)">!=</span><span style="color: rgb(0,0,0)">to)<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: rgb(0,0,255)">while</span><span style="color: rgb(0,0,0)">(from</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">to</span><span style="color: rgb(0,0,0)">&amp;&amp;</span><span style="color: rgb(0,0,0)">array[from].compareTo(tmp)</span><span style="color: rgb(0,0,0)">&lt;=</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">)from</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(from</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">to)<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;array[to]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[from];</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">now&nbsp;from's&nbsp;position&nbsp;is&nbsp;available</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to</span><span style="color: rgb(0,0,0)">--</span><span style="color: rgb(0,0,0)">;<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;</span><span style="color: rgb(0,0,255)">while</span><span style="color: rgb(0,0,0)">(from</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">to</span><span style="color: rgb(0,0,0)">&amp;&amp;</span><span style="color: rgb(0,0,0)">array[to].compareTo(tmp)</span><span style="color: rgb(0,0,0)">&gt;=</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">)to</span><span style="color: rgb(0,0,0)">--</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">(from</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">to)<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;array[from]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">array[to];</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">now&nbsp;to's&nbsp;position&nbsp;is&nbsp;available&nbsp;now&nbsp;</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">;<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;array[from]</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">tmp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;from;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;selectPivot(E[]&nbsp;array,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;from,&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;to)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;(from</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">to)</span><span style="color: rgb(0,0,0)">/</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<br />
还有归并排序，堆排序，桶式排序，基数排序，下次在归纳。</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/167380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-13 09:13 <a href="http://www.blogjava.net/baoyaer/articles/167380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java   --TreeMap,HashMap  </title><link>http://www.blogjava.net/baoyaer/articles/166838.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 11 Dec 2007 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166838.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166838.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166838.html</trackback:ping><description><![CDATA[&nbsp;1&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #008000">&nbsp;*&nbsp;MapTest.java<br />
</span><span style="color: #008080">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #008000">&nbsp;*<br />
</span><span style="color: #008080">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #008000">&nbsp;*&nbsp;Provider:&nbsp;CoderDream's&nbsp;Studio<br />
</span><span style="color: #008080">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #008000">&nbsp;*<br />
</span><span style="color: #008080">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #008000">&nbsp;*&nbsp;History<br />
</span><span style="color: #008080">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #008000">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;Date(DD/MM/YYYY)&nbsp;&nbsp;&nbsp;&nbsp;Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Description<br />
</span><span style="color: #008080">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #008000">&nbsp;*&nbsp;----------------------<br />
</span><span style="color: #008080">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #008000">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;Oct&nbsp;31,&nbsp;2007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoderDream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Created<br />
</span><span style="color: #008080">&nbsp;10</span>&nbsp;<span style="color: #008000">&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;11</span>&nbsp;<span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.coderdream;<br />
</span><span style="color: #008080">&nbsp;12</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;13</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.HashMap;<br />
</span><span style="color: #008080">&nbsp;14</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Iterator;<br />
</span><span style="color: #008080">&nbsp;15</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Map;<br />
</span><span style="color: #008080">&nbsp;16</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.TreeMap;<br />
</span><span style="color: #008080">&nbsp;17</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;18</span>&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;19</span>&nbsp;<span style="color: #008000">&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;CoderDream<br />
</span><span style="color: #008080">&nbsp;20</span>&nbsp;<span style="color: #008000">&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;21</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MapTest&nbsp;{<br />
</span><span style="color: #008080">&nbsp;22</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;24</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;pre&gt;<br />
</span><span style="color: #008080">&nbsp;25</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用HashMap使用1：<br />
</span><span style="color: #008080">&nbsp;26</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用迭代器得到map.entrySet(),<br />
</span><span style="color: #008080">&nbsp;27</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后通过迭代得到Map.Entry对象，最后打印。<br />
</span><span style="color: #008080">&nbsp;28</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打印结果未排序<br />
</span><span style="color: #008080">&nbsp;29</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;/pre&gt;<br />
</span><span style="color: #008080">&nbsp;30</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080">&nbsp;31</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f1()&nbsp;{<br />
</span><span style="color: #008080">&nbsp;33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();<br />
</span><span style="color: #008080">&nbsp;34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">2</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;2</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;36</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">3</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;3</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">4</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;4</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;38</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">F</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;F</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">Q</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;Q</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;map.entrySet().iterator();<br />
</span><span style="color: #008080">&nbsp;41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(it.hasNext())&nbsp;{<br />
</span><span style="color: #008080">&nbsp;42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map.Entry&nbsp;e&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Map.Entry)&nbsp;it.next();<br />
</span><span style="color: #008080">&nbsp;43</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Key:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;e.getKey()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;Value:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;44</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;e.getValue());<br />
</span><span style="color: #008080">&nbsp;45</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">&nbsp;46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">&nbsp;47</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;49</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;pre&gt;<br />
</span><span style="color: #008080">&nbsp;50</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使用泛型模式说明Map中存储的对象类型<br />
</span><span style="color: #008080">&nbsp;51</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;/pre&gt;<br />
</span><span style="color: #008080">&nbsp;52</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f2()&nbsp;{<br />
</span><span style="color: #008080">&nbsp;54</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
</span><span style="color: #008080">&nbsp;55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Mon.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Monday</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">one</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Monday</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator</span><span style="color: #000000">&lt;</span><span style="color: #000000">Map.Entry</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;map.entrySet().iterator();<br />
</span><span style="color: #008080">&nbsp;59</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;60</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(it.hasNext())&nbsp;{<br />
</span><span style="color: #008080">&nbsp;61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map.Entry&nbsp;entry&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;it.next();<br />
</span><span style="color: #008080">&nbsp;62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(entry.getKey()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;entry.getValue());<br />
</span><span style="color: #008080">&nbsp;63</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">&nbsp;64</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">&nbsp;65</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;66</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;67</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;pre&gt;<br />
</span><span style="color: #008080">&nbsp;68</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;通过集合Set来得到HashMap中的对象<br />
</span><span style="color: #008080">&nbsp;69</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;/pre&gt;<br />
</span><span style="color: #008080">&nbsp;70</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080">&nbsp;71</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;72</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f3()&nbsp;{<br />
</span><span style="color: #008080">&nbsp;73</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();<br />
</span><span style="color: #008080">&nbsp;74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Mon.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;75</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Monday</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;76</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">one</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Monday</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;77</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;map.keySet().iterator();<br />
</span><span style="color: #008080">&nbsp;78</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tmpKey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;79</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(it.hasNext())&nbsp;{<br />
</span><span style="color: #008080">&nbsp;80</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpKey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;it.next();<br />
</span><span style="color: #008080">&nbsp;81</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Key:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;tmpKey&nbsp;<br />
</span><span style="color: #008080">&nbsp;82</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;Value:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;map.get(tmpKey));<br />
</span><span style="color: #008080">&nbsp;83</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">&nbsp;84</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">&nbsp;85</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;86</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;87</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;pre&gt;<br />
</span><span style="color: #008080">&nbsp;88</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用TreeMap代替HashMap，取得结果是排序后的结果<br />
</span><span style="color: #008080">&nbsp;89</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;/pre&gt;<br />
</span><span style="color: #008080">&nbsp;90</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;91</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f4()&nbsp;{<br />
</span><span style="color: #008080">&nbsp;92</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TreeMap();<br />
</span><span style="color: #008080">&nbsp;93</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;94</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">2</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;2</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;95</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">3</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;3</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;96</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">4</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;4</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;97</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">F</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;F</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;98</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000">"</span><span style="color: #000000">Q</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Level&nbsp;Q</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;99</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;map.entrySet().iterator();<br />
</span><span style="color: #008080">100</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(it.hasNext())&nbsp;{<br />
</span><span style="color: #008080">101</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map.Entry&nbsp;e&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Map.Entry)&nbsp;it.next();<br />
</span><span style="color: #008080">102</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Key:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;e.getKey()&nbsp;<br />
</span><span style="color: #008080">103</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;Value:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;e.getValue());<br />
</span><span style="color: #008080">104</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">105</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">106</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">107</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">108</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
</span><span style="color: #008080">109</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #008080">110</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080">111</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">112</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MapTest&nbsp;mt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MapTest();<br />
</span><span style="color: #008080">113</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">----------f1()----------</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">114</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mt.f1();<br />
</span><span style="color: #008080">115</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">----------f2()----------</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">116</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mt.f2();<br />
</span><span style="color: #008080">117</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">----------f3()----------</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">118</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mt.f3();<br />
</span><span style="color: #008080">119</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">----------f4()----------</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">120</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mt.f4();<br />
</span><span style="color: #008080">121</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">122</span>&nbsp;<span style="color: #000000">}</span><br />
<br />
输出结果：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: Courier; background-color: #eeeeee"><span style="color: #000000">----------</span><span style="color: #000000">f1()</span><span style="color: #000000">----------</span><span style="color: #000000"><br />
Key:&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;&nbsp;Value:&nbsp;Level&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000"><br />
Key:&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;Value:&nbsp;Level&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000"><br />
Key:&nbsp;F;&nbsp;Value:&nbsp;Level&nbsp;F<br />
Key:&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;Value:&nbsp;Level&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
Key:&nbsp;Q;&nbsp;Value:&nbsp;Level&nbsp;Q<br />
Key:&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">;&nbsp;Value:&nbsp;Level&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000"><br />
</span><span style="color: #000000">----------</span><span style="color: #000000">f2()</span><span style="color: #000000">----------</span><span style="color: #000000"><br />
</span><span style="color: #000000">1</span><span style="color: #000000">:Monday<br />
one:Monday<br />
</span><span style="color: #000000">----------</span><span style="color: #000000">f3()</span><span style="color: #000000">----------</span><span style="color: #000000"><br />
Key:&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;Value:&nbsp;Monday<br />
Key:&nbsp;one;&nbsp;Value:&nbsp;Monday<br />
</span><span style="color: #000000">----------</span><span style="color: #000000">f4()</span><span style="color: #000000">----------</span><span style="color: #000000"><br />
Key:&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;Value:&nbsp;Level&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
Key:&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;Value:&nbsp;Level&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000"><br />
Key:&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;&nbsp;Value:&nbsp;Level&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000"><br />
Key:&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">;&nbsp;Value:&nbsp;Level&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000"><br />
Key:&nbsp;F;&nbsp;Value:&nbsp;Level&nbsp;F<br />
Key:&nbsp;Q;&nbsp;Value:&nbsp;Level&nbsp;Q<br />
</span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/166838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-11 09:23 <a href="http://www.blogjava.net/baoyaer/articles/166838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java泛型再学习 </title><link>http://www.blogjava.net/baoyaer/articles/157114.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 31 Oct 2007 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/157114.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/157114.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/157114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/157114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/157114.html</trackback:ping><description><![CDATA[<h2 style="font-family: Arial">&nbsp;</h2>
<div class="postText">&nbsp;&nbsp;&nbsp; 泛型引入java语言已经有很长一段时间了，在JDK5出来的时候也非常认真地学习过，不过学习的资料都是网上泛滥并且重复的教程。这几天下了《The Java Programming Language》的第4版，准备把jdk5引入的新东西再重新系统地学习一次，同时再次回顾下java基础。今天记录下学习泛型那一章的注意点。<br />
<span style="font-weight: bold">一、泛型类型的声明</span><br />
<span style="font-weight: bold">1</span>.需要着重注意的一点，比如声明类Cell&lt;E&gt;：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;net.rubyeye.javaprogramming.generic;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;next;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;E&nbsp;element;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Cell(E&nbsp;element)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.element&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Cell(E&nbsp;element,&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;next)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.element&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;E&nbsp;getElement()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setElement(E&nbsp;element)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.element&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getNext()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setNext(Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;next)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
然后如此使用：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;strCell&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">Integer</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;intCell&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">Integer</span><span style="color: #000000">&gt;</span><span style="color: #000000">(</span><span style="color: #000000">25</span><span style="color: #000000">);<br />
</span></div>
<br />
那么Cell&lt;String&gt;和Cell&lt;Integer&gt;是两个类吗？不，他们是同一个类，通过下面的实验证明：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">assertTrue(strCell.getClass()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;intCell.getClass()));<br />
</span></div>
<br />
java泛型的实现采用的&#8220;擦拭法&#8221;，Cell&lt;E&gt;仍然是一个类，无论E被任何具体的类型所替代。 <br />
<br />
<span style="font-weight: bold">2</span>.泛型的类型参数不能用于static变量、static方法和static初始化，比如下面的使用方式都不能编译通过：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;test(E&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; <br />
</span></div>
同样，静态方法是与类相关联的，调用也只能通过类，假设Cell有一个静态方法test，怎么调用才是正确的呢?<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">.test();&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">编译错误</span><span style="color: #008000"><br />
</span><span style="color: #000000">Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">.test();&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">同样编译错误</span><span style="color: #008000"><br />
</span><span style="color: #000000">Cell.test();&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">正确的方式</span></div>
类似的，泛型的类型参数不能用于声明数组类型,比如下面的代码同样无法编译通过：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SingleLinkQueue</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;E[]&nbsp;toArray()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<span style="font-weight: bold">3</span>.类型参数可以继承其他的类和接口，如果有多个接口可以用&amp;符号连接，通过extend参数限制了类型参数的范围，比如：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;SortedCharSeqCollection</span><span style="color: #000000">&lt;</span><span style="color: #000000">E&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Comparable</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;CharSequence</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;sorted&nbsp;char&nbsp;sequence&nbsp;collection&nbsp;methods&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}<br />
<br />
</span></div>
SortedCharSeqCollection的类型参数E强制继承自Comparable和CharSequence接口，也就是替代的具体的类型参数必须实现这两个接口，从而限制了类型参数（type parameter)。<br />
<br />
<span style="font-weight: bold">4</span>.比较有趣的内部类的泛型，对于静态内部类的类型参数可以与外部类的类型参数名不一样，静态内部类的类型参数与外部类的类型参数其实没有一点关系，比如：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SingleLinkQueue</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;E&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Cell(E&nbsp;element)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.element&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Cell(E&nbsp;element,&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;next)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.element&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;E&nbsp;getElement()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;rest&nbsp;of&nbsp;Cell&nbsp;methods&nbsp;as&nbsp;before&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;head;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;tail;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;rest&nbsp;of&nbsp;SingleLinkQueue&nbsp;methods&nbsp;as&nbsp;before&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
}<br />
<br />
</span></div>
<br />
Cell&lt;E&gt;类的声明和SingleLinkQueue&lt;E&gt; 两个类中的E仅仅是名称相同，他们之间的关联是通过head和tail的声明才关联在一起，你可以将Cell&lt;E&gt;中的E改成F也没关系，比如：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;net.rubyeye.javaprogramming.generic;<br />
<br />
</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AnotherSingleLinkQueue</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">F</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">F</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;next;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;F&nbsp;element;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Cell(F&nbsp;element)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.element&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Cell(F&nbsp;element,&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">F</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;next)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.element&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;F&nbsp;getElement()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;element;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;rest&nbsp;of&nbsp;Cell&nbsp;methods&nbsp;as&nbsp;before&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;head;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Cell</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;tail;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;rest&nbsp;of&nbsp;SingleLinkQueue&nbsp;methods&nbsp;as&nbsp;before&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
}<br />
</span></div>
<br />
而一般的内部类就不一样了，内部类可以直接使用外部类的类型参数甚至隐藏。<br />
<br />
<span style="font-weight: bold">二、子类型与通配符</span><br />
今天读了第2节，泛型的使用比我原先所知的更为复杂，java语法本来以简洁优美著称，随着java5,java7的到来，语法是越来越复杂，甚至可以说丑陋!-_-<br />
<br />
&nbsp;&nbsp;&nbsp; 要知道一点，比如List&lt;Integer&gt;不是List&lt;Number&gt;的子类，而是Collection&lt;Integer&gt;的子类。因为List&lt;Integer&gt;和List&lt;Number&gt;的类型是一样的，都是List。那么如何表示参数化类型是Number的子类呢？这就需要用到通配符：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">List</span><span style="color: #000000">&lt;?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Number</span><span style="color: #000000">&gt;</span></div>
表示类型变量是Number或者Number的子类。这个就是所谓的上界通配符，同样，如果要表示类型变量是Number或者Number的super type，可以使用下界通配符：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">List</span><span style="color: #000000">&lt;?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">&nbsp;Number</span><span style="color: #000000">&gt;</span></div>
<br />
而通配符List&lt;?&gt;等价于：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">List</span><span style="color: #000000">&lt;?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Object</span><span style="color: #000000">&gt;</span></div>
<br />
&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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyList&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;?&gt;</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
</span><span style="color: #000000">}</span></div>
&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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">SingleLinkQueue</span><span style="color: #000000">&lt;?&gt;</span><span style="color: #000000">&nbsp;strings&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SingleLinkQueue</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
strings.add(</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;INVALID: 无法编译</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
SingleLinkQueue</span><span style="color: #000000">&lt;?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Number</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;numbers&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SingleLinkQueue</span><span style="color: #000000">&lt;</span><span style="color: #000000">Number</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
numbers.add(Integer.valueOf(</span><span style="color: #000000">25</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;INVALID: 无法编译</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
</span></div>
<br />
<span style="font-weight: bold">三、泛型方法和类型推断</span><br />
&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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T&nbsp;passThrough(T&nbsp;obj)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;obj;<br />
}<br />
</span></div>
<br />
这个方法限制传入的参数的类型与返回的参数类型将一致，可以看到，在方法签名前加上&lt;T&gt;即可。我们可以这样调用这个方法：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">String&nbsp;s1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
String&nbsp;s2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">passThrough(s1);<br />
</span></div>
<br />
这样的调用是不是比较奇怪？幸好提供了<span style="font-weight: bold">类型推断</span>，根据参数的类型来自动判断方法的类型（比如返回值类型），因此可以直接调用：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">String&nbsp;s1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
String&nbsp;s2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.passThrough(s1);<br />
</span></div>
<br />
&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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;T&nbsp;passThrough(T&nbsp;obj1,T&nbsp;obj2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(T)(obj1.toString()</span><span style="color: #000000">+</span><span style="color: #000000">obj2.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
然后我们传入两个参数，一个String，一个int，那么返回什么呢？<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">String&nbsp;s1</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
String&nbsp;s3</span><span style="color: #000000">=</span><span style="color: #0000ff">this</span><span style="color: #000000">.passThrough(s1,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">编译出错</span></div>
类型推断是比较复杂的，这里将返回的将是Object类型，是传入的参数类型的<span style="font-weight: bold">交集</span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/157114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-31 09:55 <a href="http://www.blogjava.net/baoyaer/articles/157114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM启动参数</title><link>http://www.blogjava.net/baoyaer/articles/156857.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 30 Oct 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/156857.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/156857.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/156857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/156857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/156857.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/highroad/archive/2006/08/04/1019581.aspx"><img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0"  alt="" />&nbsp;JVM启动参数</a>&nbsp;&nbsp; <script src="http://blog.csdn.net/count.aspx?ID=1019581&amp;Type=Rank"></script><span title="文章指数:81"><img src="http://blog.csdn.net/images/star.gif" border="0"  alt="" /><img src="http://blog.csdn.net/images/star.gif" border="0"  alt="" /><img src="http://blog.csdn.net/images/star.gif" border="0"  alt="" /><img src="http://blog.csdn.net/images/star.gif" border="0"  alt="" /><img src="http://blog.csdn.net/images/star_half.gif" border="0"  alt="" /></span>&nbsp;&nbsp;<img title="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" src="http://blog.csdn.net/images/ask.gif" border="0" />
<div class="postText">
<h1 style="margin: 0cm 0cm 0pt 21.25pt"><font size="5"></font>&nbsp;</h1>
<h2 style="margin: 0cm 0cm 0pt 1cm"><font size="3"><font color="#993300"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">1.1 </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式</span></font></font></h2>
<p class="a" style="margin: 3pt 0cm"><span lang="EN-US"><font face="Times New Roman" size="3">java [jvmargs] class [arguments]</font></span></p>
<h2 style="margin: 0cm 0cm 0pt 1cm"><font size="3"><font color="#993300"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">1.2 </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准参数</span></font></font></h2>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman">1.-server<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>-client<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虚拟机服务器模式</span><span lang="EN-US"><font face="Times New Roman">/</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户机模式，使用</span><span lang="EN-US"><font face="Times New Roman">server</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式可以提高性能，启动比</span><span lang="EN-US"><font face="Times New Roman">client</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式慢，长期运行则比</span><span lang="EN-US"><font face="Times New Roman">client</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式快。当该参数不指定时，虚拟机启动检测主机是否为服务器，如果是则以</span><span lang="EN-US"><font face="Times New Roman">server</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式启动，否则以</span><span lang="EN-US"><font face="Times New Roman">client</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式启动，</span><span lang="EN-US"><font face="Times New Roman">J2SE5.0</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">检测的根据是至少</span><span lang="EN-US"><font face="Times New Roman">2</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和最低</span><span lang="EN-US"><font face="Times New Roman">2GB</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内存</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman">2.-agentlib:&lt;lib-name&gt;=&lt;options&gt;<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>-agentpath:&lt;lib-path&gt;=&lt;options&gt;<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本地类库加载，当你的部分类包含一些本地方法时，需要自己编写本地代码并位于操作系统加载共享包</span><span lang="EN-US"><font face="Times New Roman">(dll)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的路径上，如果你不喜欢将该包放在操作系统识别的加载上，则可以通过指定这个参数来加载自己的本地共享包</span><span lang="EN-US"><font face="Times New Roman">(dll)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。不同之处在于</span><span lang="EN-US"><font face="Times New Roman">-agentlib</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中仅指定包名，根据操作系统的不同虚拟机在一定路径上搜索该包，譬如对于</span><span lang="EN-US"><font face="Times New Roman">windows</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台虚拟机在</span><span lang="EN-US"><font face="Times New Roman">PATH</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">路径上搜索该包，而</span><span lang="EN-US"><font face="Times New Roman">lib-path</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则是指定全路径，例如</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>-agentlib:hprof<span style="mso-spacerun: yes">&nbsp; </span></font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US"><font face="Times New Roman">windows</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台虚拟机会在启动时到</span><span lang="EN-US"><font face="Times New Roman">PATH</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">路径上搜索</span><span lang="EN-US"><font face="Times New Roman">hprof.dll</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并加载</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;</font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虚拟机在加载代理包之后有一个启动的操作（详细参见</span><span lang="EN-US"><font face="Times New Roman">JDK</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参考），</span><span lang="EN-US"><font face="Times New Roman">&lt;options&gt;</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指的是代理包的启动参数</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>3.-classpath classpath<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-c classpath<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;</font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指定类路径，系统应用类加载器</span><span lang="EN-US"><font face="Times New Roman">(ClassLoader)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会到该路径下加载类</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>4.-Dproperty=value<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;</font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置系统属性，可以通过</span><span lang="EN-US"><font face="Times New Roman">System.getProperty(property)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>5.-enableassertions[:&lt;package name&gt;"..." | :&lt;class name&gt; ]<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-ea[:&lt;package name&gt;"..." | :&lt;class name&gt; ]<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-disableassertions[:&lt;package name&gt;"..." | :&lt;class ; ]<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-da[:&lt;package name&gt;"..." | :&lt;class name&gt; ]<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启用和停用断言，默认是停用断言。断言指的是从</span><span lang="EN-US"><font face="Times New Roman">JDK1.4</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始在支持的关键字</span><span lang="EN-US"><font face="Times New Roman">assert</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US"><font face="Times New Roman">assert(booleanvalue)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，当</span><span lang="EN-US"><font face="Times New Roman">booleanvalue</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span><span lang="EN-US"><font face="Times New Roman">false</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，抛出</span><span lang="EN-US"><font face="Times New Roman">java.lang.AssertionError</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，必须指出的是，代码编译必须是</span><span lang="EN-US"><font face="Times New Roman">1.4</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">及其以上顺从的，即编译时使用如下参数</span></font></p>
<p class="a" style="margin: 3pt 0cm"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span><span style="mso-spacerun: yes">&nbsp; </span>java -source 1.4</font></font></span></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般仅在开发阶段启用断言，而在运行阶段不使用</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其使用包括如下几种情况</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>java -ea//</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启动断言</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>java -ea:pkname...<span style="mso-spacerun: yes">&nbsp; </span>//</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在包</span><span lang="EN-US"><font face="Times New Roman">pkname</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">及其子包下起用断言</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>java -ea:pkname.classname<span style="mso-spacerun: yes">&nbsp; </span>//</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对类</span><span lang="EN-US"><font face="Times New Roman"> pkname.classname</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启用断言</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">停用断言与启用设置类似</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>6.-enablesystemassertions<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-esa<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-disablesystemassertions<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span><span style="mso-spacerun: yes">&nbsp; </span>-dsa<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启用和停用系统类断言</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>7.-jar<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行包含在一个</span><span lang="EN-US"><font face="Times New Roman">jar</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包里的程序，一般在</span><span lang="EN-US"><font face="Times New Roman">jar</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包的</span><span lang="EN-US"><font face="Times New Roman">/META-INF/MANIFEST.MF</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件中指定</span><span lang="EN-US"><font face="Times New Roman">Main-Class</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">值为要运行的主函数，譬如</span><span lang="EN-US"><font face="Times New Roman"> Main-Class:ayufox.ejb3.Test</font></span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>8.-javaagent:&lt;classname&gt;[&lt;=options&gt;]<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加载</span><span lang="EN-US"><font face="Times New Roman">java</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言代理，该功能是</span><span lang="EN-US"><font face="Times New Roman">JDK5</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">新增加的，可以通过该设置在</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行主函数</span><span lang="EN-US"><font face="Times New Roman">(main)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之前做一些预处理工作，其中</span><span lang="EN-US"><font face="Times New Roman">classname</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中必须包含有静态方法</span></font></p>
<p class="a" style="margin: 3pt 0cm"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>public static void premain(String agentArgs, Instrumentation inst) { ... }</font></font></span></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面的</span><span lang="EN-US"><font face="Times New Roman">options</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即是传入该函数的代理参数</span><span lang="EN-US"><font face="Times New Roman">agentArgs</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，关于</span><span lang="EN-US"><font face="Times New Roman">Instrumentation</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">详细参见包</span><span lang="EN-US"><font face="Times New Roman">java.lang.instrument</font></span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><font face="Times New Roman"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;</span></span></strong><strong style="mso-bidi-font-weight: normal"><span lang="DE" style="mso-ansi-language: DE">9.-verbose<O:P></O:P></span></strong></font></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="DE" style="mso-ansi-language: DE"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-verbose:class<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="DE" style="mso-ansi-language: DE"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-verbose:gc<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="DE" style="mso-ansi-language: DE"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-verbose:jni<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="DE" style="mso-ansi-language: DE"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在运行时</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>class:</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将类加载情况在控制台中打印出来</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>gc:</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将虚拟机的垃圾回收事件信息打印</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>jni:</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">放本地方法调用信息打印</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-verbose</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</span><span lang="EN-US"><font face="Times New Roman">-verbose:class</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一样</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>10.-version<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><span lang="EN-US"><font face="Times New Roman" size="3">-showversion</font></span></p>
<p class="a" style="margin: 3pt 0cm"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">显示版本信息，不同在于第一种显示版本后虚拟机结束退出</font></span></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>11.-?<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman">-help<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">显示帮助信息并退出</font></span></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>12.-X<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">显示非标准参数（见下面介绍）并退出</font></span></p>
<h2 style="margin: 0cm 0cm 0pt 1cm"><font size="3"><font color="#993300"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">1.3 </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">非标准参数（以</span><span lang="EN-US"><font face="Times New Roman">-X</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开头）</span><span lang="EN-US"><O:P></O:P></span></font></font></h2>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>1.-Xint<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所有字节码以解析模式运行。第一代虚拟机即是以这种方式运行，由于需要</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解析器解析运行，所以效率比较低；第二代虚拟机则采用将字节码编译成本地代码的方式，效率大大提高；第三代虚拟机也叫自适应</span><span lang="EN-US"><font face="Times New Roman">(HotSpot)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虚拟机，通过监测代码的执行情况检测出代码被频繁执行的部分，将其尽量优化成本地代码方式运行，而对于普通部分，则采用解析的模式运行。</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>2.-Xbatch<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">禁止后台编译，一般</span><span lang="EN-US"><font face="Times New Roman">HotSpot</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虚拟机在检测到一段代码为频繁执行代码需要将其编译成本地代码时，会启动一个后台线程完成这个工作，而同时采用解析的方式继续运行字节码。如果设置了该参数，则会停止继续执行字节码，先将其编译成本地代码，然后再继续执行。</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>3.-Xdebug<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-Xnoagent<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-Xrun<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-Xrunjdwp<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;</font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启用调试模式，见前面的《利用</span><span lang="EN-US"><font face="Times New Roman">JPDA</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构建调试平台》这篇文章，后面将在一个独立的文章中详细介绍</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>4.-Xbootclasspath:bootclasspath <O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-Xbootclasspath/a:path <O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-Xbootclasspath/p:path <O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置启动根</span><span lang="EN-US"><font face="Times New Roman">Classpath</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，即使启动类加载器将在何处加载对象，关于类启动加载器，参见《</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类加载器体系结构》说明，分号后面的值指定路径，以分号隔开。其区别在于，</span><span lang="EN-US"><font face="Times New Roman">-Xbootclasspath:bootclasspath</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将新的根加载路径覆盖默认的路径（</span><span lang="EN-US"><font face="Times New Roman">\jre\lib\rt.jar</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），</span><span lang="EN-US"><font face="Times New Roman">-Xbootclasspath/a:path</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将新的根加载路径和原有的根加载路径相结合，</span><span lang="EN-US"><font face="Times New Roman">-Xbootclaspath/p:path</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将新的根加载路径与原有的根加载路径相结合，加载类时优先搜索该加载路径</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>5.-Xcheck:jni<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对本地调用（</span><span lang="EN-US"><font face="Times New Roman">JNI</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）采用更严格的检测方式，在进行</span><span lang="EN-US"><font face="Times New Roman">JNI</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用之前检测数据和传入参数，如果碰到不合法的数据则强制结束掉虚拟机，对运行性能有损害</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>6.-Xfuture<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对类格式</span><span lang="EN-US"><font face="Times New Roman">(class</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件格式</span><span lang="EN-US"><font face="Times New Roman">)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用更严格的检测方式，以便向后兼容，最好在开发时采用该参数</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>7.-Xnoclassgc<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><font color="#ff0000"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不使用回收装载类的内存(转贴备注:按原文修改)</span></font></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>8.-Xloggc:file<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</span><span lang="EN-US"><font face="Times New Roman">-verbose:gc</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">功能一样，不同在于</span><span lang="EN-US"><font face="Times New Roman">-Xloggc:file</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将信息记录到一个文件，而</span><span lang="EN-US"><font face="Times New Roman">-verbose:gc</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将其输出到控制台</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>9.-Xincgc<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-Xmsn<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-Xmxn<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>-Xssn <O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">跟内存分配和垃圾回收相关，</span><span lang="EN-US"><font face="Times New Roman">-Xincgc</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示采用渐进式垃圾回收，</span><span lang="EN-US"><font face="Times New Roman">-Xmsn</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置初始内存池大小，</span><span lang="EN-US"><font face="Times New Roman">-Xmxn</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示内存池允许的最大大小，</span><span lang="EN-US"><font face="Times New Roman">-Xssn</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是线程栈大小，</span><span lang="EN-US"><font face="Times New Roman">n</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是要设置的值，必须是</span><span lang="EN-US"><font face="Times New Roman">1024</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的倍数，譬如</span></font></p>
<p class="a" style="margin: 3pt 0cm"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>-Xms6291456 -Xmx83886080</font></font></span></p>
<p class="a" style="margin: 3pt 0cm"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>-Xms6144k -Xmx81920k</font></font></span></p>
<p class="a" style="margin: 3pt 0cm"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>-Xms6m -Xmx80m</font></font></span></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">该部分对虚拟机的性能非常重要，在后面将有独立的篇章详细介绍</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>10.-Xprof<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><span lang="EN-US"><font face="Times New Roman" size="3">-Xrunhprof[:help][:&lt;suboption&gt;=&lt;value&gt;,...]</font></span></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在运行时剖析运行情况，并将剖析结果打印到控制台，其中后一个可以指定特定剖析对象，譬如</span><span lang="EN-US"><font face="Times New Roman">cpu</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，堆</span><span lang="EN-US"><font face="Times New Roman">(heap)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等，可以运行</span><span lang="EN-US"><font face="Times New Roman">java -Xrunhprof:help</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得可以剖析的对象和取值</span></font></p>
<p class="a" style="margin: 3pt 0cm"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>11.-Xrs<O:P></O:P></font></font></span></strong></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">减少</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对操作系统信号量的使用，</span><span lang="EN-US"><font face="Times New Roman">J2SE1.3.1</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始引入。</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>SUN</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US"><font face="Times New Roman">J2SE1.3.0</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中增加了</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用程序关闭时的回调钩子</span><span lang="EN-US"><font face="Times New Roman">(Hook)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，以便当</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">意外终止时用户可以做一些资源清除工作。</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">监视控制台事件以实现</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">意外终止时的回调。</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">明确地注册了一个控制台控制处理器，当</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接收到</span><span lang="EN-US"><font face="Times New Roman">CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, </font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span><span lang="EN-US"><font face="Times New Roman">CTRL_SHUTDOWN</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事件时，该处理器介入关闭回掉钩子</span><span lang="EN-US"><font face="Times New Roman">(HOOK)</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的处理。</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果虚拟机以服务的方式运行（譬如</span><span lang="EN-US"><font face="Times New Roman">WEB</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务器）当其收到</span><span lang="EN-US"><font face="Times New Roman">CTRL_LOGOFF_EVENT</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事件，由于系统并不会因此终止</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程，故</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不可以进行终止的操作，然而这与如上产生了冲突（不结束却又调用关闭回调钩子），为了避免这个问题，从</span><span lang="EN-US"><font face="Times New Roman">J2SE1.3.1</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span><span lang="EN-US"><font face="Times New Roman">-Xrs</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以使</span><span lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不再监测控制台事件。</span></font></p>
<p class="a" style="margin: 3pt 0cm"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参考：</span><span lang="EN-US"><font face="Times New Roman">JDK5.0</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参考文档</span><span lang="EN-US"><font face="Times New Roman">http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html</font></span></font></p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/156857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-30 10:01 <a href="http://www.blogjava.net/baoyaer/articles/156857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程编程 基础篇 </title><link>http://www.blogjava.net/baoyaer/articles/151392.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 09 Oct 2007 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/151392.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/151392.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/151392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/151392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/151392.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [线程对象和线程的区别]线程对象是可以产生线程的对象。比如在java平台中Thread对象，Runnable对象。线程，是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始，运行run方法体中的那一段相对独立的过程。　让我们先从最简单的"单线程"来入手&nbsp;class&nbsp;BeginClass{&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/151392.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/151392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-09 14:34 <a href="http://www.blogjava.net/baoyaer/articles/151392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在java中利用动态编译实现eval</title><link>http://www.blogjava.net/baoyaer/articles/151289.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 09 Oct 2007 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/151289.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/151289.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/151289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/151289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/151289.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p><br />
　我们知道,在很多脚本语言中都有eval函数,它可以把字符串转换为表达式并执行.如在javaScript中:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;aid.value&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">.style.top&nbsp;=&nbsp;10;</span><span style="color: #000000">"</span><span style="color: #000000">　</span></div>
<p>　<br />
把一个id为"aid"的控制的值取出来加合并成一个字符串,如果aid的值是"axman",则</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; str = "axman.style.top = 10"　　<br />
现在我们要让控制axman移动到顶部为10的位置:</p>
<p><span style="color: red">eval(str);　</span>　<br />
这样这个字符串就变成了表达式或语句开始执行.这样的功能对于动态构造变量是有非常重要的<br />
意义.</p>
<p>　　那么在java中,如果实现这个功能呢?其实我们可以用动态编译来实现。</p>
<p>动态编译实现eval<br />
　　假设有一组方法实现不同的功能,现在要根据传进来的方法名调用相应的方法,假如没有eval功能,我们只能这么做:</p>
<p>MyClass mc = new MyClass();<br />
if(str.equals("m1"))<br />
&nbsp;&nbsp; mc.m1();<br />
else if(str.equals("m1"))<br />
&nbsp;&nbsp; mc.m2();<br />
else if(str.equals("m3"))<br />
&nbsp;&nbsp; mc.m3(); <br />
else if(.........)<br />
&nbsp;&nbsp; .........();<br />
　　如果有一百种情况呢?</p>
<p>　　如果我们用eval方法就可以直接这样:</p>
<p>&nbsp;&nbsp;&nbsp; String str = ...........;<br />
&nbsp; eval("mc"+str+"();");　　<br />
&nbsp;是不是非常方便?关键是如何实现eval()?</p>
<p>　　我们把要转换的字符串构造一个完整的类:如果方法是有返回值的.则:</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_30_841_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_841_Open_Text.style.display='none'; Codehighlighter1_30_841_Closed_Image.style.display='inline'; Codehighlighter1_30_841_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_30_841_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_30_841_Closed_Text.style.display='none'; Codehighlighter1_30_841_Open_Image.style.display='inline'; Codehighlighter1_30_841_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;eval(String&nbsp;str)</span><span id="Codehighlighter1_30_841_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_30_841_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">生成java文件</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">class&nbsp;Temp{</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />s&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Object&nbsp;rt(){</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />s&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">MyClass&nbsp;mc&nbsp;=&nbsp;new&nbsp;MyClass();</span><span style="color: #000000">"</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;s&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;return&nbsp;mc.</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">str</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">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">}</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />s&nbsp;</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">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;File&nbsp;f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(</span><span style="color: #000000">"</span><span style="color: #000000">Temp.java</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;pw&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PrintWriter(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileWriter(f));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;pw.println(s);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;pw.close();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">动态编译</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;com.sun.tools.javac.Main&nbsp;javac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;com.sun.tools.javac.Main();<br />
<img id="Codehighlighter1_430_455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_430_455_Open_Text.style.display='none'; Codehighlighter1_430_455_Closed_Image.style.display='inline'; Codehighlighter1_430_455_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_430_455_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_430_455_Closed_Text.style.display='none'; Codehighlighter1_430_455_Open_Image.style.display='inline'; Codehighlighter1_430_455_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;String[]&nbsp;cpargs&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[]&nbsp;</span><span id="Codehighlighter1_430_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_430_455_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">"</span><span style="color: #000000">-d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">所在目录</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Temp.java</span><span style="color: #000000">"</span><span style="color: #000000">}</span></span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;status&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;javac.compile(cpargs);<br />
<img id="Codehighlighter1_513_577_Open_Image" onclick="this.style.display='none'; Codehighlighter1_513_577_Open_Text.style.display='none'; Codehighlighter1_513_577_Closed_Image.style.display='inline'; Codehighlighter1_513_577_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_513_577_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_513_577_Closed_Text.style.display='none'; Codehighlighter1_513_577_Open_Image.style.display='inline'; Codehighlighter1_513_577_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(status</span><span style="color: #000000">!=</span><span style="color: #000000">0</span><span style="color: #000000">)</span><span id="Codehighlighter1_513_577_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_513_577_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;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">没有成功编译源文件!</span><span style="color: #000000">"</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用Temp的rt方法返回结果:</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;MyClassLoader&nbsp;mc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyClassLoader();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Class&nbsp;clasz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mc.loadClass(</span><span style="color: #000000">"</span><span style="color: #000000">Test.class</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_742_759_Open_Image" onclick="this.style.display='none'; Codehighlighter1_742_759_Open_Text.style.display='none'; Codehighlighter1_742_759_Closed_Image.style.display='inline'; Codehighlighter1_742_759_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_742_759_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_742_759_Closed_Text.style.display='none'; Codehighlighter1_742_759_Open_Image.style.display='inline'; Codehighlighter1_742_759_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Method&nbsp;rt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;clasz.getMethod(</span><span style="color: #000000">"</span><span style="color: #000000">rt</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Class[]</span><span id="Codehighlighter1_742_759_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_742_759_Open_Text"><span style="color: #000000">{&nbsp;String[].</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">);<br />
<img id="Codehighlighter1_802_818_Open_Image" onclick="this.style.display='none'; Codehighlighter1_802_818_Open_Text.style.display='none'; Codehighlighter1_802_818_Closed_Image.style.display='inline'; Codehighlighter1_802_818_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_802_818_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_802_818_Closed_Text.style.display='none'; Codehighlighter1_802_818_Open_Image.style.display='inline'; Codehighlighter1_802_818_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;rt.invoke(</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[]&nbsp;</span><span id="Codehighlighter1_802_818_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_802_818_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;}</span></span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果方法没有返回就直接调用</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span></div>
<p><br />
　　我们可以先写好多个重载的eval,有返回值和没有返回值的.以及可以传递参数的.</p>
<p>　　这样我们就可以用字符串转换为java的语句来执行.</p>
<p>　　本文只是一个例子,说明了一个动态编译的思想,更好的实现请各位朋友自己来完成.</p>
<p>　　后记：关于动态编译的参数,补充说明一下: </p>
<p>String[] cpargs = new String[]<br />
{"-d", "所在目录","Temp.java"}; 　　-d指明的目录应该是当前目录,因为生成的java文件是以当前目录为"/"然后在此目录下建立相应的包的."当前目录"应该用new File(".").getAbsoultPath()来确定.</p>
<p>　　java文件如果有package,在生成的时候应该建立相应的子目录.而这个参数应该是 java源文件的file对象的getAbsoultPath(), 如当前应用程序是在d:\debug目录运行,动态生成的java文件有个package 为temp; </p>
<p>　　则 String[] cpargs = new String[] {"-d", "d:\\debud","d:\\debug\\temp\\Temp.java"};这样生成的class文件应该和java源文件在同一目录d:\debug\\temp\下.</p>
<p>　　重载loadClass方法时应该注意能正确读取到class文件</p>
<p>&nbsp;完整的列子：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.File;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.FileWriter;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.PrintWriter;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.Method;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.tools.javac.Main;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_167_1618_Open_Image" onclick="this.style.display='none'; Codehighlighter1_167_1618_Open_Text.style.display='none'; Codehighlighter1_167_1618_Closed_Image.style.display='inline'; Codehighlighter1_167_1618_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_167_1618_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_167_1618_Closed_Text.style.display='none'; Codehighlighter1_167_1618_Open_Image.style.display='inline'; Codehighlighter1_167_1618_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;testJavac</span><span id="Codehighlighter1_167_1618_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_167_1618_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_200_235_Open_Image" onclick="this.style.display='none'; Codehighlighter1_200_235_Open_Text.style.display='none'; Codehighlighter1_200_235_Closed_Image.style.display='inline'; Codehighlighter1_200_235_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_200_235_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_200_235_Closed_Text.style.display='none'; Codehighlighter1_200_235_Open_Image.style.display='inline'; Codehighlighter1_200_235_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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()</span><span id="Codehighlighter1_200_235_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_200_235_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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">刘凯毅</span><span style="color: #000000">"</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;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_264_296_Open_Image" onclick="this.style.display='none'; Codehighlighter1_264_296_Open_Text.style.display='none'; Codehighlighter1_264_296_Closed_Image.style.display='inline'; Codehighlighter1_264_296_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_264_296_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_264_296_Closed_Text.style.display='none'; Codehighlighter1_264_296_Open_Image.style.display='inline'; Codehighlighter1_264_296_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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAvg()</span><span id="Codehighlighter1_264_296_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_264_296_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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">24</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;}</span></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;<br />
<img id="Codehighlighter1_361_1444_Open_Image" onclick="this.style.display='none'; Codehighlighter1_361_1444_Open_Text.style.display='none'; Codehighlighter1_361_1444_Closed_Image.style.display='inline'; Codehighlighter1_361_1444_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_361_1444_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_361_1444_Closed_Text.style.display='none'; Codehighlighter1_361_1444_Open_Image.style.display='inline'; Codehighlighter1_361_1444_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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;eval(String&nbsp;str)</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_361_1444_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_361_1444_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;</span><span style="color: #008000">//</span><span style="color: #008000">生成java文件</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">class&nbsp;Temp{</span><span style="color: #000000">"</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;s&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">private&nbsp;testJavac&nbsp;tj&nbsp;=&nbsp;new&nbsp;testJavac();</span><span style="color: #000000">"</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;s&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">public&nbsp;String&nbsp;rt(){</span><span style="color: #000000">"</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;s&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;return&nbsp;&nbsp;\</span><span style="color: #000000">"</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">+tj.</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">str</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">&nbsp;&nbsp;;<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;s&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">}</span><span style="color: #000000">"</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;s&nbsp;</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">;<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;<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;File&nbsp;f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(System.getProperty(</span><span style="color: #000000">"</span><span style="color: #000000">user.dir</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">\\Temp.java</span><span style="color: #000000">"</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;PrintWriter&nbsp;pw&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PrintWriter(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileWriter(f));<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;pw.println(s);<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;pw.close();<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;</span><span style="color: #008000">//</span><span style="color: #008000">动态编译</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main&nbsp;javac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Main();<br />
<img id="Codehighlighter1_914_964_Open_Image" onclick="this.style.display='none'; Codehighlighter1_914_964_Open_Text.style.display='none'; Codehighlighter1_914_964_Closed_Image.style.display='inline'; Codehighlighter1_914_964_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_914_964_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_914_964_Closed_Text.style.display='none'; Codehighlighter1_914_964_Open_Image.style.display='inline'; Codehighlighter1_914_964_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;String[]&nbsp;cpargs&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[]&nbsp;</span><span id="Codehighlighter1_914_964_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_914_964_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">"</span><span style="color: #000000">-d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;System.getProperty(</span><span style="color: #000000">"</span><span style="color: #000000">user.dir</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;,</span><span style="color: #000000">"</span><span style="color: #000000">Temp.java</span><span style="color: #000000">"</span><span style="color: #000000">}</span></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;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;status&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;javac.compile(cpargs);<br />
<img id="Codehighlighter1_1038_1126_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1038_1126_Open_Text.style.display='none'; Codehighlighter1_1038_1126_Closed_Image.style.display='inline'; Codehighlighter1_1038_1126_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1038_1126_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1038_1126_Closed_Text.style.display='none'; Codehighlighter1_1038_1126_Open_Image.style.display='inline'; Codehighlighter1_1038_1126_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;</span><span style="color: #0000ff">if</span><span style="color: #000000">(status</span><span style="color: #000000">!=</span><span style="color: #000000">0</span><span style="color: #000000">)</span><span id="Codehighlighter1_1038_1126_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_1038_1126_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;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">没有成功编译源文件!</span><span style="color: #000000">"</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</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;}</span></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;</span><span style="color: #008000">//</span><span style="color: #008000">调用Temp的rt方法返回结果:</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassLoader&nbsp;mc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getClassLoader();<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;<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;Class&nbsp;clasz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mc.loadClass(</span><span style="color: #000000">"</span><span style="color: #000000">Temp</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1336_1337_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1336_1337_Open_Text.style.display='none'; Codehighlighter1_1336_1337_Closed_Image.style.display='inline'; Codehighlighter1_1336_1337_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1336_1337_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1336_1337_Closed_Text.style.display='none'; Codehighlighter1_1336_1337_Open_Image.style.display='inline'; Codehighlighter1_1336_1337_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;Method&nbsp;rt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;clasz.getMethod(</span><span style="color: #000000">"</span><span style="color: #000000">rt</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Class[]</span><span id="Codehighlighter1_1336_1337_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_1336_1337_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">);<br />
<img id="Codehighlighter1_1403_1405_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1403_1405_Open_Text.style.display='none'; Codehighlighter1_1403_1405_Closed_Image.style.display='inline'; Codehighlighter1_1403_1405_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1403_1405_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1403_1405_Closed_Text.style.display='none'; Codehighlighter1_1403_1405_Open_Image.style.display='inline'; Codehighlighter1_1403_1405_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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;rt.invoke(clasz.newInstance(),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[]&nbsp;</span><span id="Codehighlighter1_1403_1405_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_1403_1405_Open_Text"><span style="color: #000000">{&nbsp;}</span></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;</span><span style="color: #008000">//</span><span style="color: #008000">如果方法没有返回就直接调用</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></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;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1521_1615_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1521_1615_Open_Text.style.display='none'; Codehighlighter1_1521_1615_Closed_Image.style.display='inline'; Codehighlighter1_1521_1615_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1521_1615_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1521_1615_Closed_Text.style.display='none'; Codehighlighter1_1521_1615_Open_Image.style.display='inline'; Codehighlighter1_1521_1615_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]args)</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_1521_1615_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_1521_1615_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;testJavac&nbsp;jj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;testJavac();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;jj.eval(args[</span><span style="color: #000000">0</span><span style="color: #000000">])&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/151289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-09 10:42 <a href="http://www.blogjava.net/baoyaer/articles/151289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]Tomcat类加载机制 </title><link>http://www.blogjava.net/baoyaer/articles/149426.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Sat, 29 Sep 2007 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/149426.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/149426.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/149426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/149426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/149426.html</trackback:ping><description><![CDATA[<div style="margin-top: 10px; margin-left: 15px; overflow: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>Tomcat Server在启动的时候将构造一个ClassLoader树，以保证模块的类库是私有的 <br />
            Tomcat Server的ClassLoader结构如下： <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Bootstrap&nbsp;&nbsp;&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Common&nbsp;&nbsp;&nbsp;<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;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Catalina&nbsp;&nbsp;Shared&nbsp;&nbsp;&nbsp;<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;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebApp1&nbsp;&nbsp;WebApp2&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
            </div>
            <script>render_code();</script><br />
            其中： <br />
            - Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar <br />
            - System - 载入$CLASSPATH/*.class <br />
            - Common - 载入$CATALINA_HOME/common/...，它们对TOMCAT和所有的WEB APP都可见 <br />
            - Catalina - 载入$CATALINA_HOME/server/...，它们仅对TOMCAT可见，对所有的WEB APP都不可见 <br />
            - Shared - 载入$CATALINA_HOME/shared/...，它们仅对所有WEB APP可见，对TOMCAT不可见（也不必见） <br />
            - WebApp - 载入ContextBase?/WEB-INF/...，它们仅对该WEB APP可见
            <p>&nbsp;</p>
            <p>每个运行中的线程都有一个成员contextClassLoader，用来在运行时动态地载入其它类，系统默认的contextClassLoader是systemClassLoader，所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类，可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader，来改变其载入类的行为</p>
            <p>ClassLoader被组织成树形，一般的工作原理是： <br />
            1) 线程需要用到某个类，于是contextClassLoader被请求来载入该类 <br />
            2) contextClassLoader请求它的父ClassLoader来完成该载入请求 <br />
            3) 如果父ClassLoader无法载入类，则contextClassLoader试图自己来载入 <br />
            注意：WebApp?ClassLoader的工作原理和上述有少许不同： <br />
            它先试图自己载入类（在ContextBase?/WEB-INF/...中载入类），如果无法载入，再请求父ClassLoader完成</p>
            <p>由此可得： <br />
            - 对于WEB APP线程，它的contextClassLoader是WebApp?ClassLoader <br />
            - 对于Tomcat Server线程，它的contextClassLoader是CatalinaClassLoader </p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/149426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-09-29 09:08 <a href="http://www.blogjava.net/baoyaer/articles/149426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM启动参数(转) </title><link>http://www.blogjava.net/baoyaer/articles/138305.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 21 Aug 2007 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/138305.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/138305.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/138305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/138305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/138305.html</trackback:ping><description><![CDATA[<div>
<h2>&nbsp;</h2>
Posted on 2007-08-16 13:39 <a href="http://www.blogjava.net/zhuyuanxiang/">朱远翔-Apusic技术支持工程师</a> 阅读(426) <a href="http://www.blogjava.net/zhuyuanxiang/archive/2007/08/16/137211.html#Post">评论(0)</a> &nbsp;<a href="http://www.blogjava.net/zhuyuanxiang/admin/EditPosts.aspx?postid=137211">编辑</a>&nbsp;<a href="http://www.blogjava.net/zhuyuanxiang/AddToFavorite.aspx?id=137211">收藏</a> <a href="http://www.blogjava.net/zhuyuanxiang/services/trackbacks/137211.aspx">引用</a> 所属分类: <a href="http://www.blogjava.net/zhuyuanxiang/category/23748.html">Java世界</a> <img height=1 src="http://www.blogjava.net/zhuyuanxiang/aggbug/137211.html?webview=1" width=1> <!--
--></div>
<div>
<h2><font size=5><font color=#000000><span><font face=Arial>1.1</font></span><span>格式</span></font></font></h2>
<p><span>java[jvmargs]class[arguments]</span></p>
<h2><font size=5><font color=#000000><span><font face=Arial>1.2</font></span><span>标准参数</span></font></font></h2>
<h3><span><font size=5>1.-server</font></span></h3>
<p><span>-client</span></p>
<p><span>虚拟机服务器模式</span><span>/</span><span>客户机模式，使用</span><span>server</span><span>模式可以提高性能，启动比</span><span>client</span><span>模式慢，长期运行则比</span><span>client</span><span>模式快。当该参数不指定时，虚拟机启动检测主机是否为服务器，如果是则以</span><span>server</span><span>模式启动，否则以</span><span>client</span><span>模式启动，</span><span>J2SE5.0</span><span>检测的根据是至少</span><span>2</span><span>个</span><span>CPU</span><span>和最低</span><span>2GB</span><span>内存。（编者注：使用server模式启动必须使用JDK，但是对于机器好像没有这个要求）</span></p>
<h3><span><font size=5>2.-agentlib:&lt;lib-name&gt;=&lt;options&gt;</font></span></h3>
<p><span>-agentpath:&lt;lib-path&gt;=&lt;options&gt;</span></p>
<p><span>本地类库加载，当你的部分类包含一些本地方法时，需要自己编写本地代码并位于操作系统加载共享包</span><span>(dll)</span><span>的路径上，如果你不喜欢将该包放在操作系统识别的加载上，则可以通过指定这个参数来加载自己的本地共享包</span><span>(dll)</span><span>。不同之处在于</span><span>-agentlib</span><span>中仅指定包名，根据操作系统的不同虚拟机在一定路径上搜索该包，譬如对于</span><span>windows</span><span>平台虚拟机在</span><span>PATH</span><span>路径上搜索该包，而</span><span>lib-path</span><span>则是指定全路径，例如</span></p>
<p><span>-agentlib:hprof</span><span>在</span><span>windows</span><span>平台虚拟机会在启动时到</span><span>PATH</span><span>路径上搜索</span><span>hprof.dll</span><span>并加载</span></p>
<p><span>虚拟机在加载代理包之后有一个启动的操作（详细参见</span><span>JDK</span><span>参考），</span><span>&lt;options&gt;</span><span>指的是代理包的启动参数</span></p>
<h3><span><font size=5>3.-classpathclasspath</font></span></h3>
<p><span>-cclasspath</span></p>
<p><span>指定类路径，系统应用类加载器</span><span>(ClassLoader)</span><span>会到该路径下加载类</span></p>
<h3><span><font size=5>4.-Dproperty=value</font></span></h3>
<p><span>设置系统属性，可以通过</span><span>System.getProperty(property)</span><span>获得</span></p>
<h3><span><font size=5>5.-enableassertions[:&lt;packagename&gt;"..."|:&lt;classname&gt;]</font></span></h3>
<p><span>-ea[:&lt;packagename&gt;"..."|:&lt;classname&gt;]</span></p>
<p><span>-disableassertions[:&lt;packagename&gt;"..."|:&lt;class;]</span></p>
<p><span>-da[:&lt;packagename&gt;"..."|:&lt;classname&gt;]</span></p>
<p><span>启用和停用断言，默认是停用断言。断言指的是从</span><span>JDK1.4</span><span>开始在支持的关键字</span><span>assert</span><span>，</span><span>assert(booleanvalue)</span><span>，当</span><span>booleanvalue</span><span>为</span><span>false</span><span>时，抛出</span><span>java.lang.AssertionError</span><span>，必须指出的是，代码编译必须是</span><span>1.4</span><span>及其以上顺从的，即编译时使用如下参数</span></p>
<p><span>java-source1.4</span></p>
<p><span>一般仅在开发阶段启用断言，而在运行阶段不使用</span></p>
<p><span>其使用包括如下几种情况</span></p>
<p><span>java-ea//</span><span>启动断言</span></p>
<p><span>java-ea:pkname...//</span><span>在包</span><span>pkname</span><span>及其子包下起用断言</span></p>
<p><span>java-ea:pkname.classname//</span><span>对类</span><span>pkname.classname</span><span>启用断言</span></p>
<p><span>停用断言与启用设置类似</span></p>
<h3><span><font size=5>6.-enablesystemassertions</font></span></h3>
<p><span>-esa</span></p>
<p><span>-disablesystemassertions</span></p>
<p><span>-dsa</span></p>
<p><span>启用和停用系统类断言</span></p>
<h3><span><font size=5>7.-jar</font></span></h3>
<p><span>运行包含在一个</span><span>jar</span><span>包里的程序，一般在</span><span>jar</span><span>包的</span><span>/META-INF/MANIFEST.MF</span><span>文件中指定</span><span>Main-Class</span><span>值为要运行的主函数，譬如</span><span>Main-Class:ayufox.ejb3.Test</span></p>
<h3><span><font size=5>8.-javaagent:&lt;classname&gt;[&lt;=options&gt;]</font></span></h3>
<p><span>加载</span><span>java</span><span>语言代理，该功能是</span><span>JDK5</span><span>新增加的，可以通过该设置在</span><span>JVM</span><span>运行主函数</span><span>(main)</span><span>之前做一些预处理工作，其中</span><span>classname</span><span>中必须包含有静态方法</span></p>
<p><span>publicstaticvoidpremain(StringagentArgs,Instrumentationinst){...}</span></p>
<p><span>上面的</span><span>options</span><span>即是传入该函数的代理参数</span><span>agentArgs</span><span>，关于</span><span>Instrumentation</span><span>详细参见包</span><span>java.lang.instrument</span></p>
<h3><span><font size=5>9.-verbose</font></span></h3>
<p><span>-verbose:class</span></p>
<p><span>-verbose:gc</span></p>
<p><span>-verbose:jni</span></p>
<p><span>在运行时</span></p>
<p><span>class:</span><span>将类加载情况在控制台中打印出来</span></p>
<p><span>gc:</span><span>将虚拟机的垃圾回收事件信息打印</span></p>
<p><span>jni:</span><span>放本地方法调用信息打印</span></p>
<p><span>-verbose</span><span>与</span><span>-verbose:class</span><span>一样</span></p>
<h3><span><font size=5>10.-version</font></span></h3>
<p><span>-showversion</span></p>
<p><span>显示版本信息，不同在于第一种显示版本后虚拟机结束退出</span></p>
<h3><span><font size=5>11.-?</font></span></h3>
<p><span>-help</span></p>
<p><span>显示帮助信息并退出</span></p>
<h3><span><font size=5>12.-X</font></span></h3>
<p><span>显示非标准参数（见下面介绍）并退出</span></p>
<h2><font size=5><font color=#000000><span><font face=Arial>1.3</font></span><span>非标准参数（以</span><span><font face=Arial>-X</font></span><span>开头）</span></font></font></h2>
<h3><span><font size=5>1.-Xint</font></span></h3>
<p><span>所有字节码以解析模式运行。第一代虚拟机即是以这种方式运行，由于需要</span><span>Java</span><span>解析器解析运行，所以效率比较低；第二代虚拟机则采用将字节码编译成本地代码的方式，效率大大提高；第三代虚拟机也叫自适应</span><span>(HotSpot)</span><span>虚拟机，通过监测代码的执行情况检测出代码被频繁执行的部分，将其尽量优化成本地代码方式运行，而对于普通部分，则采用解析的模式运行。</span></p>
<h3><span><font size=5>2.-Xbatch</font></span></h3>
<p><span>禁止后台编译，一般</span><span>HotSpot</span><span>虚拟机在检测到一段代码为频繁执行代码需要将其编译成本地代码时，会启动一个后台线程完成这个工作，而同时采用解析的方式继续运行字节码。如果设置了该参数，则会停止继续执行字节码，先将其编译成本地代码，然后再继续执行。</span></p>
<h3><span><font size=5>3.-Xdebug</font></span></h3>
<p><span>-Xnoagent</span></p>
<p><span>-Xrun</span></p>
<p><span>-Xrunjdwp</span></p>
<p><span>启用调试模式，见前面的《利用</span><span>JPDA</span><span>构建调试平台》这篇文章，后面将在一个独立的文章中详细介绍</span></p>
<h3><span><font size=5>4.-Xbootclasspath:bootclasspath</font></span></h3>
<p><span>-Xbootclasspath/a:path</span></p>
<p><span>-Xbootclasspath/p:path</span></p>
<p><span>设置启动根</span><span>Classpath</span><span>，即使启动类加载器将在何处加载对象，关于类启动加载器，参见《</span><span>JVM</span><span>类加载器体系结构》说明，分号后面的值指定路径，以分号隔开。其区别在于，</span><span>-Xbootclasspath:bootclasspath</span><span>将新的根加载路径覆盖默认的路径（</span><span>\jre\lib\rt.jar</span><span>），</span><span>-Xbootclasspath/a:path</span><span>将新的根加载路径和原有的根加载路径相结合，</span><span>-Xbootclaspath/p:path</span><span>将新的根加载路径与原有的根加载路径相结合，加载类时优先搜索该加载路径</span></p>
<h3><span><font size=5>5.-Xcheck:jni</font></span></h3>
<p><span>对本地调用（</span><span>JNI</span><span>）采用更严格的检测方式，在进行</span><span>JNI</span><span>调用之前检测数据和传入参数，如果碰到不合法的数据则强制结束掉虚拟机，对运行性能有损害</span></p>
<h3><span><font size=5>6.-Xfuture</font></span></h3>
<p><span>对类格式</span><span>(class</span><span>文件格式</span><span>)</span><span>采用更严格的检测方式，以便向后兼容，最好在开发时采用该参数</span></p>
<h3><span><font size=5>7.-Xnoclassgc</font></span></h3>
<p><span>不使用回收装载类的内存</span><span>(</span><span>转贴备注</span><span>:</span><span>按原文修改</span><span>)</span></p>
<h3><span><font size=5>8.-Xloggc:file</font></span></h3>
<p><span>与</span><span>-verbose:gc</span><span>功能一样，不同在于</span><span>-Xloggc:file</span><span>将信息记录到一个文件，而</span><span>-verbose:gc</span><span>将其输出到控制台</span></p>
<h3><span><font size=5>9.-Xincgc</font></span></h3>
<p><span>-Xmsn</span></p>
<p><span>-Xmxn</span></p>
<p><span>-Xssn</span></p>
<p><span>跟内存分配和垃圾回收相关，</span><span>-Xincgc</span><span>表示采用渐进式垃圾回收，</span><span>-Xmsn</span><span>设置初始内存池大小，</span><span>-Xmxn</span><span>表示内存池允许的最大大小，</span><span>-Xssn</span><span>是线程栈大小，</span><span>n</span><span>是要设置的值，必须是</span><span>1024</span><span>的倍数，譬如</span></p>
<p><span>-Xms6291456-Xmx83886080</span></p>
<p><span>-Xms6144k-Xmx81920k</span></p>
<p><span>-Xms6m-Xmx80m</span></p>
<p><span>该部分对虚拟机的性能非常重要，在后面将有独立的篇章详细介绍</span></p>
<h3><span><font size=5>10.-Xprof</font></span></h3>
<p><span>-Xrunhprof[:help][:&lt;suboption&gt;=&lt;value&gt;,...]</span></p>
<p><span>在运行时剖析运行情况，并将剖析结果打印到控制台，其中后一个可以指定特定剖析对象，譬如</span><span>cpu</span><span>，堆</span><span>(heap)</span><span>等，可以运行</span><span>java-Xrunhprof:help</span><span>获得可以剖析的对象和取值</span></p>
<h3><span><font size=5>11.-Xrs</font></span></h3>
<p><span>减少</span><span>JVM</span><span>对操作系统信号量的使用，</span><span>J2SE1.3.1</span><span>开始引入。</span></p>
<p><span>SUN</span><span>在</span><span>J2SE1.3.0</span><span>中增加了</span><span>Java</span><span>应用程序关闭时的回调钩子</span><span>(Hook)</span><span>，以便当</span><span>JVM</span><span>意外终止时用户可以做一些资源清除工作。</span><span>JVM</span><span>监视控制台事件以实现</span><span>JVM</span><span>意外终止时的回调。</span><span>JVM</span><span>明确地注册了一个控制台控制处理器，当</span><span>JVM</span><span>接收到</span><span>CTRL_C_EVENT,CTRL_CLOSE_EVENT,CTRL_LOGOFF_EVENT,</span><span>或</span><span>CTRL_SHUTDOWN</span><span>事件时，该处理器介入关闭回掉钩子</span><span>(HOOK)</span><span>的处理。</span></p>
<p><span>如果虚拟机以服务的方式运行（譬如</span><span>WEB</span><span>服务器）当其收到</span><span>CTRL_LOGOFF_EVENT</span><span>事件，由于系统并不会因此终止</span><span>JVM</span><span>进程，故</span><span>JVM</span><span>不可以进行终止的操作，然而这与如上产生了冲突（不结束却又调用关闭回调钩子），为了避免这个问题，从</span><span>J2SE1.3.1</span><span>使用</span><span>-Xrs</span><span>以使</span><span>JVM</span><span>不再监测控制台事件。</span></p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/138305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-08-21 11:12 <a href="http://www.blogjava.net/baoyaer/articles/138305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的UDP协议编程 [zt]</title><link>http://www.blogjava.net/baoyaer/articles/137443.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 17 Aug 2007 01:00:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/137443.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/137443.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/137443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/137443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/137443.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;一. UDP协议定义&nbsp;&nbsp; UDP协议的全称是用户数据报，在网络中它与TCP协议一样用于处理数据包。在OSI模型中，在第四层——传输层，处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点，也就是说，当报文发送之后，是无法得知其是否安全完整到达的。二. 使用UDP的原因&nbsp;&nbsp; 它不属于连接型协议，因而具有资源消耗小，处理...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/137443.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/137443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-08-17 09:00 <a href="http://www.blogjava.net/baoyaer/articles/137443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入HashCode方法 </title><link>http://www.blogjava.net/baoyaer/articles/133921.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 02 Aug 2007 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/133921.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/133921.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/133921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/133921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/133921.html</trackback:ping><description><![CDATA[<p>&nbsp;<br />
&nbsp; </p>
<p>为什么HashCode对于对象是如此的重要? <br />
　　一个对象的HashCode就是一个简单的Hash算法的实现，虽然它和那些真正的复杂的Hash算法相比还不能叫真正的算法，它如何实现它，不仅仅是程序员的编程水平问题，而是关系到你的对象在存取是性能的非常重要的关系.有可能，不同的HashCode可能会使你的对象存取产生，成百上千倍的性能差别。</p>
<p>　　我们先来看一下，在JAVA中两个重要的数据结构:HashMap和Hashtable，虽然它们有很大的区别，如继承关系不同，对的约束条件(是否允许null)不同，以及线程安全性等有着特定的区别，但从实现原理上来说，它们是一致的.所以，我们只以Hashtable来说明:</p>
<p>　　在java中，存取数据的性能，一般来说当然是首推数组，但是在数据量稍大的容器选择中，Hashtable将有比数组性能更高的查询速度.具体原因看下面的内容。</p>
<p>　　Hashtable在存储数据时，一般先将作为key的对象的HashCode和0x7FFFFFFF做与操作，因为一个对象的HashCode可以为负数，这样操作后可以保证它为一个正整数.然后以Hashtable的长度取模，得到值对象在Hashtable中的索引。</p>
<p>　　index = (o.hashCode() &amp; 0x7FFFFFFF)%hs.length;这个值对象就会直接放在Hashtable的第index位置，对于写入，这和数组一样，把一个对象放在其中的第index位置，但如果是查询，经过同样的算法，Hashtable可以直接通过key得到index，从第index取得这个值对象，而数组却要做循环比较.所以对于数据量稍大时，Hashtable的查询比数据具有更高的性能。</p>
<p>　　虽然不同对象有不同的hashcode，但不同的hashCode经过与长度的取余，就很可能产生相同的index。</p>
<p>　　极端情况下会有大量的对象产生一个相同的索引.这就是关系Hashtable性能问题的最重要的问题:</p>
<p>　　Hash冲突。</p>
<p>　　常见的Hash冲突是不同key对象最终产生了相同的索引，而一种非常甚至绝对少见的Hash冲突是，如果一组对象的个数大过了int范围，而HashCode的长度只能在int范围中，所以肯定要有同一组的元素有相同的HashCode，这样无论如何他们都会有相同的索引.当然这种极端的情况是极少见的，可以暂不考虑，但是对于同的HashCode经过取模，则会产中相同的索引，或者不同的对象却具有相同的HashCode，当然具有相同的索引。</p>
<p>　　事实上一个设计各好的HashTable，一般来说会比较平均地分布每个元素，因为Hashtable的长度总是比实际元素的个数按一定比例进行自增(装填因子一般为0.75)左右，这样大多数的索引位置只有一个对象，而很少的位置会有几个元素.所以Hashtable中的每个位置存放的是一个链表，对于只有一个对象是位置，链表只有一个首节点(Entry)，Entry的next为null.然后有hashCode，key，属性保存了该位置的对象的HashCode，key和(对象本身)，如果有相同索引的对象进来则会进入链表的下一个节点.如果同一个索引中有多个对象，根据HashCode和key可以在该链表中找到一个和查询的key相匹配的对象。</p>
<p>　　从上面我看可以看到，对于HashMap和Hashtable的存取性能有重大影响的首先是应该使该数据结构中的元素尽量大可能具有不同的HashCode，虽然这并不能保证不同的HashCode产生不同的index，但相同的HashCode一定产生相同的index，从而影响产生Hash冲突。</p>
<p>　　对于一个象，如果具有很多属性，把所有属性都参与散列，显然是一种笨拙的设计.因为对象的HashCode()方法几乎无所不在地被自动调用，如equals比较，如果太多的对象参与了散列.那么需要的操作常数时间将会增加很大.所以，挑选哪些属性参与散列绝对是一个编程水平的问题。</p>
<p>　　从实现来说，一般的HashCode方法会这样:</p>
<p>　　return Attribute1.HashCode() + Attribute1.HashCode()..[+super.HashCode()]。</p>
<p>　　我们知道，每次调用这个方法，都要重新对方法内的参与散列的对象重新计算一次它们的HashCode的运算，如果一个对象的属性没有改变，仍然要每次都进行计算，所以如果设置一个标记来缓存当前的散列码，只要当参与散列的对象改变时才重新计算，否则调用缓存的hashCode，这可以从很大程度上提高性能。</p>
<p>　　默认的实现是将对象内部地址转化为整数作为HashCode，这当然能保证每个对象具有不同的HasCode，因为不同的对象内部地址肯定不同(废话)，但java语言并不能让程序员获取对象内部地址，所以，让每个对象产生不同的HashCode有着很多可研究的技术。</p>
<p>　　如果从多个属性中采样出能具有平均分布的hashCode的属性，这是一个性能和多样性相矛盾的地方，如果所有属性都参与散列，当然hashCode的多样性将大大提高，但牺牲了性能，而如果只能少量的属性采样散列，极端情况会产生大量的散列冲突，如对"人"的属性中，如果用性别而不是姓名或出生日期，那将只有两个或几个可选的hashcode值，将产生一半以上的散列冲突.所以如果可能的条件下，专门产生一个序列用来生成HashCode将是一个好的选择(当然产生序列的性能要比所有属性参与散列的性能高的情况下才行，否则还不如直接用所有属性散列)。</p>
<p>　　如何对HashCode的性能和多样性求得一个平衡，可以参考相关算法设计的书，其实并不一定要求非常的优秀，只要能尽最大可能减少散列值的聚集.重要的是我们应该记得HashCode对于我们的程序性能有着生要的影响，在程序设计时应该时时加以注意。<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/133921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-08-02 09:53 <a href="http://www.blogjava.net/baoyaer/articles/133921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>