﻿<?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-Chan Chen Coding...-文章分类-Scala / Java</title><link>http://www.blogjava.net/czihong/category/49360.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 15 Feb 2014 02:06:32 GMT</lastBuildDate><pubDate>Sat, 15 Feb 2014 02:06:32 GMT</pubDate><ttl>60</ttl><item><title>SPARK环境搭建-WINDOWS版本</title><link>http://www.blogjava.net/czihong/articles/409866.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 14 Feb 2014 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/409866.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/409866.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/409866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/409866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/409866.html</trackback:ping><description><![CDATA[转载: <a href="http://hammer.sinaapp.com/?p=333">Spark环境搭建-WIndows版本</a> <br /><br />这段时间在看Scala语言方面的资料，接触到了Spark，于是昨天下午在公司，把Spark的环境搭建起来了。安装的时候陪到了一个问题，在网上没有找到解决方案，于是自己查了一下原因。现在做一下笔记。<br /><br />1. spark的下载文件可以在官方找到，地址：http://spark.incubator.apache.org/downloads.html ，这次装的是截至目前为止，最新的版本：0.9<br /><br />2. 下载完以后，直接解压到指定的路径，例如，d：/programs<br /><br />3. 安装scala，并制定Scala_Home路径，scala安装请查看官网<br /><br />4. 按照Spark官方的安装指南，在解压的目录下，运行<br /><br />sbt/sbt package<br /><br />命令就可以。<br /><br />但是这是针对linux和OS X系统的，在windows下运行这条命令，会报错：<br /><br />not a valid command<br /><br />这个问题是因为，spark知道的sbt脚本无法在windows下运行，只要在网上下载一个windows版本的sbt，然后将里面的文件拷贝到Spark目录下的sbt （http://www.scala-sbt.org/），然后在运行命令，安装就会成功。<br /><br />&nbsp;<br />试试spark-shell<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #008080; ">&nbsp;1</span>&nbsp;scala&gt;&nbsp;val&nbsp;textFile&nbsp;=&nbsp;sc.textFile(<span style="font-weight: bold;">"</span><span style="font-weight: bold;">README.md</span><span style="font-weight: bold;">"</span>)<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">12</span>&nbsp;INFO&nbsp;MemoryStore:&nbsp;ensureFreeSpace(<span style="color: #800000; ">35480</span>)&nbsp;called&nbsp;with&nbsp;curMem=<span style="color: #800000; ">177376</span>,&nbsp;maxMem=<span style="color: #800000; ">308713881</span><br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">12</span>&nbsp;INFO&nbsp;MemoryStore:&nbsp;Block&nbsp;broadcast_5&nbsp;stored&nbsp;as&nbsp;<span style="color: #0000FF; ">values</span>&nbsp;to&nbsp;memory&nbsp;(estimated&nbsp;size&nbsp;<span style="color: #800000; ">34.6</span>&nbsp;KB,&nbsp;free&nbsp;<span style="color: #800000; ">294.2</span>&nbsp;MB)<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;textFile:&nbsp;org.apache.spark.rdd.RDD[String]&nbsp;=&nbsp;MappedRDD[<span style="color: #800000; ">16</span>]&nbsp;at&nbsp;textFile&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">12</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;scala&gt;&nbsp;textFile.count<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;FileInputFormat:&nbsp;Total&nbsp;input&nbsp;paths&nbsp;to&nbsp;process&nbsp;:&nbsp;<span style="color: #800000; ">1</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Starting&nbsp;job:&nbsp;count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span><br /><span style="color: #008080; ">10</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Got&nbsp;job&nbsp;<span style="color: #800000; ">7</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;output&nbsp;partitions&nbsp;(allowLocal=false)<br /><span style="color: #008080; ">11</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Final&nbsp;stage:&nbsp;Stage&nbsp;<span style="color: #800000; ">7</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Parents&nbsp;of&nbsp;final&nbsp;stage:&nbsp;List()<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Missing&nbsp;parents:&nbsp;List()<br /><span style="color: #008080; ">14</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Submitting&nbsp;Stage&nbsp;<span style="color: #800000; ">7</span>&nbsp;(MappedRDD[<span style="color: #800000; ">16</span>]&nbsp;at&nbsp;textFile&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">12</span>),&nbsp;which&nbsp;has&nbsp;<span style="color: #0000FF; ">no</span>&nbsp;missin<br /><span style="color: #008080; ">15</span>&nbsp;g&nbsp;parents<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Submitting&nbsp;<span style="color: #800000; ">1</span>&nbsp;missing&nbsp;tasks&nbsp;from&nbsp;Stage&nbsp;<span style="color: #800000; ">7</span>&nbsp;(MappedRDD[<span style="color: #800000; ">16</span>]&nbsp;at&nbsp;textFile&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">12</span>)<br /><span style="color: #008080; ">17</span>&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSchedulerImpl:&nbsp;Adding&nbsp;task&nbsp;set&nbsp;<span style="color: #800000; ">7.0</span>&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;tasks<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Starting&nbsp;task&nbsp;<span style="color: #800000; ">7.0</span>:<span style="color: #800000; ">0</span>&nbsp;as&nbsp;TID&nbsp;<span style="color: #800000; ">5</span>&nbsp;on&nbsp;executor&nbsp;localhost:&nbsp;localhost&nbsp;(PROCESS_LOCAL)<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Serialized&nbsp;task&nbsp;<span style="color: #800000; ">7.0</span>:<span style="color: #800000; ">0</span>&nbsp;as&nbsp;<span style="color: #800000; ">1560</span>&nbsp;bytes&nbsp;in&nbsp;<span style="color: #800000; ">1</span>&nbsp;ms<br /><span style="color: #008080; ">21</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;Executor:&nbsp;Running&nbsp;task&nbsp;ID&nbsp;<span style="color: #800000; ">5</span><br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;BlockManager:&nbsp;Found&nbsp;block&nbsp;broadcast_5&nbsp;locally<br /><span style="color: #008080; ">23</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;HadoopRDD:&nbsp;Input&nbsp;<span style="color: #0000FF; ">split</span>:&nbsp;file:/D:/program/spark-<span style="color: #800000; ">0.9</span>.<span style="color: #800000; ">0</span>-incubating/README.md:<span style="color: #800000; ">0</span>+<span style="color: #800000; ">4491</span><br /><span style="color: #008080; ">24</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;Executor:&nbsp;Serialized&nbsp;size&nbsp;of&nbsp;result&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;<span style="color: #800000; ">5</span>&nbsp;is&nbsp;<span style="color: #800000; ">563</span><br /><span style="color: #008080; ">25</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;Executor:&nbsp;Sending&nbsp;result&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;<span style="color: #800000; ">5</span>&nbsp;directly&nbsp;to&nbsp;driver<br /><span style="color: #008080; ">26</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;Executor:&nbsp;Finished&nbsp;task&nbsp;ID&nbsp;<span style="color: #800000; ">5</span><br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Finished&nbsp;TID&nbsp;<span style="color: #800000; ">5</span>&nbsp;in&nbsp;<span style="color: #800000; ">6</span>&nbsp;ms&nbsp;on&nbsp;localhost&nbsp;(progress:&nbsp;<span style="color: #800000; ">0</span>/<span style="color: #800000; ">1</span>)<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Completed&nbsp;ResultTask(<span style="color: #800000; ">7</span>,&nbsp;<span style="color: #800000; ">0</span>)<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;TaskSchedulerImpl:&nbsp;Remove&nbsp;TaskSet&nbsp;<span style="color: #800000; ">7.0</span>&nbsp;from&nbsp;pool<br /><span style="color: #008080; ">30</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Stage&nbsp;<span style="color: #800000; ">7</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;finished&nbsp;in&nbsp;<span style="color: #800000; ">0.009</span>&nbsp;s<br /><span style="color: #008080; ">31</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">14</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Job&nbsp;finished:&nbsp;count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>,&nbsp;took&nbsp;<span style="color: #800000; ">0.012329265</span>&nbsp;s<br /><span style="color: #008080; ">32</span>&nbsp;res10:&nbsp;Long&nbsp;=&nbsp;<span style="color: #800000; ">119</span><br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;scala&gt;&nbsp;textFile.first<br /><span style="color: #008080; ">35</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Starting&nbsp;job:&nbsp;first&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span><br /><span style="color: #008080; ">36</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Got&nbsp;job&nbsp;<span style="color: #800000; ">8</span>&nbsp;(first&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;output&nbsp;partitions&nbsp;(allowLocal=true)<br /><span style="color: #008080; ">37</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Final&nbsp;stage:&nbsp;Stage&nbsp;<span style="color: #800000; ">8</span>&nbsp;(first&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)<br /><span style="color: #008080; ">38</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Parents&nbsp;of&nbsp;final&nbsp;stage:&nbsp;List()<br /><span style="color: #008080; ">39</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Missing&nbsp;parents:&nbsp;List()<br /><span style="color: #008080; ">40</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Computing&nbsp;the&nbsp;requested&nbsp;partition&nbsp;locally<br /><span style="color: #008080; ">41</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;HadoopRDD:&nbsp;Input&nbsp;<span style="color: #0000FF; ">split</span>:&nbsp;file:/D:/program/spark-<span style="color: #800000; ">0.9</span>.<span style="color: #800000; ">0</span>-incubating/README.md:<span style="color: #800000; ">0</span>+<span style="color: #800000; ">4491</span><br /><span style="color: #008080; ">42</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">24</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Job&nbsp;finished:&nbsp;first&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>,&nbsp;took&nbsp;<span style="color: #800000; ">0.002671379</span>&nbsp;s<br /><span style="color: #008080; ">43</span>&nbsp;res11:&nbsp;String&nbsp;=&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Apache&nbsp;Spark</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">45</span>&nbsp;scala&gt;&nbsp;val&nbsp;linesWithSpark&nbsp;=&nbsp;textFile.filter(line&nbsp;=&gt;&nbsp;line.contains(<span style="font-weight: bold;">"</span><span style="font-weight: bold;">Spark</span><span style="font-weight: bold;">"</span>))<br /><span style="color: #008080; ">46</span>&nbsp;linesWithSpark:&nbsp;org.apache.spark.rdd.RDD[String]&nbsp;=&nbsp;FilteredRDD[<span style="color: #800000; ">17</span>]&nbsp;at&nbsp;filter&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">14</span><br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;scala&gt;&nbsp;textFile.filter(line=&gt;&nbsp;line.contains(<span style="font-weight: bold;">"</span><span style="font-weight: bold;">spark</span><span style="font-weight: bold;">"</span>)).count<br /><span style="color: #008080; ">49</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Starting&nbsp;job:&nbsp;count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span><br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Got&nbsp;job&nbsp;<span style="color: #800000; ">9</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;output&nbsp;partitions&nbsp;(allowLocal=false)<br /><span style="color: #008080; ">51</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Final&nbsp;stage:&nbsp;Stage&nbsp;<span style="color: #800000; ">9</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)<br /><span style="color: #008080; ">52</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Parents&nbsp;of&nbsp;final&nbsp;stage:&nbsp;List()<br /><span style="color: #008080; ">53</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Missing&nbsp;parents:&nbsp;List()<br /><span style="color: #008080; ">54</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Submitting&nbsp;Stage&nbsp;<span style="color: #800000; ">9</span>&nbsp;(FilteredRDD[<span style="color: #800000; ">18</span>]&nbsp;at&nbsp;filter&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>),&nbsp;which&nbsp;has&nbsp;<span style="color: #0000FF; ">no</span>&nbsp;missin<br /><span style="color: #008080; ">55</span>&nbsp;g&nbsp;parents<br /><span style="color: #008080; ">56</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Submitting&nbsp;<span style="color: #800000; ">1</span>&nbsp;missing&nbsp;tasks&nbsp;from&nbsp;Stage&nbsp;<span style="color: #800000; ">9</span>&nbsp;(FilteredRDD[<span style="color: #800000; ">18</span>]&nbsp;at&nbsp;filter&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)<br /><span style="color: #008080; ">57</span>&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSchedulerImpl:&nbsp;Adding&nbsp;task&nbsp;set&nbsp;<span style="color: #800000; ">9.0</span>&nbsp;with&nbsp;<span style="color: #800000; ">1</span>&nbsp;tasks<br /><span style="color: #008080; ">59</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Starting&nbsp;task&nbsp;<span style="color: #800000; ">9.0</span>:<span style="color: #800000; ">0</span>&nbsp;as&nbsp;TID&nbsp;<span style="color: #800000; ">6</span>&nbsp;on&nbsp;executor&nbsp;localhost:&nbsp;localhost&nbsp;(PROCESS_LOCAL)<br /><span style="color: #008080; ">60</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Serialized&nbsp;task&nbsp;<span style="color: #800000; ">9.0</span>:<span style="color: #800000; ">0</span>&nbsp;as&nbsp;<span style="color: #800000; ">1642</span>&nbsp;bytes&nbsp;in&nbsp;<span style="color: #800000; ">0</span>&nbsp;ms<br /><span style="color: #008080; ">61</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;Executor:&nbsp;Running&nbsp;task&nbsp;ID&nbsp;<span style="color: #800000; ">6</span><br /><span style="color: #008080; ">62</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;BlockManager:&nbsp;Found&nbsp;block&nbsp;broadcast_5&nbsp;locally<br /><span style="color: #008080; ">63</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;HadoopRDD:&nbsp;Input&nbsp;<span style="color: #0000FF; ">split</span>:&nbsp;file:/D:/program/spark-<span style="color: #800000; ">0.9</span>.<span style="color: #800000; ">0</span>-incubating/README.md:<span style="color: #800000; ">0</span>+<span style="color: #800000; ">4491</span><br /><span style="color: #008080; ">64</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;Executor:&nbsp;Serialized&nbsp;size&nbsp;of&nbsp;result&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;<span style="color: #800000; ">6</span>&nbsp;is&nbsp;<span style="color: #800000; ">563</span><br /><span style="color: #008080; ">65</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;Executor:&nbsp;Sending&nbsp;result&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;<span style="color: #800000; ">6</span>&nbsp;directly&nbsp;to&nbsp;driver<br /><span style="color: #008080; ">66</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;Executor:&nbsp;Finished&nbsp;task&nbsp;ID&nbsp;<span style="color: #800000; ">6</span><br /><span style="color: #008080; ">67</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSetManager:&nbsp;Finished&nbsp;TID&nbsp;<span style="color: #800000; ">6</span>&nbsp;in&nbsp;<span style="color: #800000; ">10</span>&nbsp;ms&nbsp;on&nbsp;localhost&nbsp;(progress:&nbsp;<span style="color: #800000; ">0</span>/<span style="color: #800000; ">1</span>)<br /><span style="color: #008080; ">68</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Completed&nbsp;ResultTask(<span style="color: #800000; ">9</span>,&nbsp;<span style="color: #800000; ">0</span>)<br /><span style="color: #008080; ">69</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;TaskSchedulerImpl:&nbsp;Remove&nbsp;TaskSet&nbsp;<span style="color: #800000; ">9.0</span>&nbsp;from&nbsp;pool<br /><span style="color: #008080; ">70</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;DAGScheduler:&nbsp;Stage&nbsp;<span style="color: #800000; ">9</span>&nbsp;(count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>)&nbsp;finished&nbsp;in&nbsp;<span style="color: #800000; ">0.010</span>&nbsp;s<br /><span style="color: #008080; ">71</span>&nbsp;<span style="color: #800000; ">14</span>/<span style="color: #800000; ">02</span>/<span style="color: #800000; ">14</span>&nbsp;<span style="color: #800000; ">16</span>:<span style="color: #800000; ">38</span>:<span style="color: #800000; ">37</span>&nbsp;INFO&nbsp;SparkContext:&nbsp;Job&nbsp;finished:&nbsp;count&nbsp;at&nbsp;&lt;console&gt;:<span style="color: #800000; ">15</span>,&nbsp;took&nbsp;<span style="color: #800000; ">0.020335125</span>&nbsp;s<br /><span style="color: #008080; ">72</span>&nbsp;res12:&nbsp;Long&nbsp;=&nbsp;<span style="color: #800000; ">7</span></div><br />另外Spark官网提供了入门的四段视频，但是国内被墙了，无法观看youtube，我把这四段视频放到了土豆网，大家可以看看。<br /><br /><a href="http://www.tudou.com/programs/view/sL67wfUk3AA/">Spark Screencast 1 &#8211; 搭建Spark环境</a><br /><br /><a href="http://www.tudou.com/programs/view/4iX6i6Ejmx8/">Spark Screencast 2 &#8211; Spark文档总览</a><br /><br /><a href="http://www.tudou.com/programs/view/QKpnT-f6Ef0/">Spark Screencast 3 &#8211; 转换和缓存</a><br /><br /><a href="http://www.tudou.com/programs/view/p0jhRIMkqAk/">Spark Screencast 4 &#8211; Scala独立任务</a><img src ="http://www.blogjava.net/czihong/aggbug/409866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2014-02-14 16:21 <a href="http://www.blogjava.net/czihong/articles/409866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java CyclicBarrier介绍</title><link>http://www.blogjava.net/czihong/articles/399587.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Wed, 22 May 2013 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/399587.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/399587.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/399587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/399587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/399587.html</trackback:ping><description><![CDATA[<p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; color: #aa00ff;"><span style="color: #000000; font-weight: normal;">Refer to:&nbsp;</span><a href="http://my.oschina.net/redhouse/blog/60739" style="font-weight: normal; font-family: verdana, 'courier new'; line-height: 21px;">http://my.oschina.net/redhouse/blog/60739<br /></a><br />CyclicBarrier&nbsp;</span></strong>(周期障碍)类可以帮助同步，它允许一组线程等待整个线程组到达公共屏障点。CyclicBarrier 是使用整型变量构造的，其确定组中的线程数。当一个线程到达屏障时（通过调用 CyclicBarrier.await()），它会被阻塞，直到所有线程都到达屏障，然后在该点允许所有线程继续执行。与CountDownLatch不同的是，CyclicBarrier 所有公共线程都到达后，可以继续执行下一个目标点，而CountDownLatch第一次到达指定点后，也就是记数器减制零，就无法再次执行下一目标工作。下面主要演义CyclicBarrier 的用法：<br /><br /></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">package com.test;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.text.SimpleDateFormat;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.Date;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.concurrent.BrokenBarrierException;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.concurrent.CyclicBarrier;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.concurrent.ExecutorService;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">import java.util.concurrent.Executors;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">public class TestCyclicBarrier {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">private static int[] timeWalk = { 5, 8, 15, 15, 10 }; &nbsp;<span style="padding: 0px; margin: 0px; color: #ff0000;">// 徒步需要的时间</span></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">private static int[] timeSelf = { 1, 3, 4, 4, 5 }; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="padding: 0px; margin: 0px; color: #ff0000;">&nbsp;// 自驾游</span></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">private static int[] timeBus = { 2, 4, 6, 6, 7 }; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="padding: 0px; margin: 0px; color: #ff0000;">// 旅游大巴</span></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">static String now() {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return sdf.format(new Date()) + ": ";</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">}</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">static class Tour implements Runnable {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private &nbsp; int[] &nbsp; &nbsp; times;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private &nbsp; CyclicBarrier &nbsp; &nbsp;barrier;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private &nbsp; String &nbsp; tourName;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">public Tour(CyclicBarrier barrier, String tourName, int[] times) {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.times = times;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.tourName = tourName;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.barrier = barrier;</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">}</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">public void run() {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; try {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Thread.sleep(times[0] * 1000);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(now() + tourName + " 合肥");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;barrier.await();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(times[1] * 1000);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(now() + tourName + " 南京");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;barrier.await();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Thread.sleep(times[4] * 1000);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(now() + tourName + " 上海");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;barrier.await();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(tourName + "飞机 合肥");</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} catch (InterruptedException e) {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;} catch (BrokenBarrierException e) {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;e.printStackTrace();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; }</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">}</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;">&nbsp;</p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">public static void main(String[] args) {</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CyclicBarrier barrier = new CyclicBarrier(3);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ExecutorService exec = Executors.newFixedThreadPool(3);</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exec.submit(new Tour(barrier, "徒步", timeWalk));</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exec.submit(new Tour(barrier, "自驾", timeSelf));</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exec.submit(new Tour(barrier, "大巴", timeBus));</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec.shutdown();</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">&nbsp; }</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #3b5900;">}</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;">最后执行结果如下：</p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:35: 自驾 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:36: 大巴 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:39: 徒步 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;"><br style="padding: 0px; margin: 0px;" /></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:42: 自驾 南京</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:43: 大巴 南京</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:47: 徒步 南京</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;"><br style="padding: 0px; margin: 0px;" /></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:52: 自驾 上海</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:54: 大巴 上海</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">16:24:57: 徒步 上海</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;"><br style="padding: 0px; margin: 0px;" /></span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">徒步飞机 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">自驾飞机 合肥</span></p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13.63636302947998px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; color: #ff0000;">大巴飞机 合肥</span></p><img src ="http://www.blogjava.net/czihong/aggbug/399587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-22 09:57 <a href="http://www.blogjava.net/czihong/articles/399587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 枚举7常见种用法</title><link>http://www.blogjava.net/czihong/articles/399319.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Wed, 15 May 2013 11:57:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/399319.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/399319.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/399319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/399319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/399319.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">DK1.5引入了新的类型&#8212;&#8212;枚举。在&nbsp;<span style="font-family: 'Times New Roman';">Java</span>&nbsp;中它虽然算个&#8220;小&#8221;功能，却给我的开发带来了&#8220;大&#8221;方便。</p><h2>用法一：常量</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">在<span style="font-family: 'Times New Roman';">JDK1.5</span>&nbsp;之前，我们定义常量都是：&nbsp;<span style="font-family: 'Times New Roman';">public static fianl....</span>&nbsp;。现在好了，有了枚举，可以把相关的常量分组到一个枚举类型里，而且枚举提供了比常量更多的方法。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Color&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;RED,&nbsp;GREEN,&nbsp;BLANK,&nbsp;YELLOW&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法二：switch</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">JDK1.6之前的switch语句只支持int,char,enum类型，使用枚举，能让我们的代码可读性更强。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">enum</span>&nbsp;Signal&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;GREEN,&nbsp;YELLOW,&nbsp;RED&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">class</span>&nbsp;TrafficLight&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;Signal&nbsp;color&nbsp;=&nbsp;Signal.RED;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">void</span>&nbsp;change()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">switch</span>&nbsp;(color)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">case</span>&nbsp;RED:&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color&nbsp;=&nbsp;Signal.GREEN;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">break</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">case</span>&nbsp;YELLOW:&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color&nbsp;=&nbsp;Signal.RED;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">break</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">case</span>&nbsp;GREEN:&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color&nbsp;=&nbsp;Signal.YELLOW;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">break</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法三：向枚举中添加新方法</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">如果打算自定义自己的方法，那么必须在enum实例序列的最后添加一个分号。而且&nbsp;<span style="font-family: 'Courier New';">Java</span>&nbsp;要求必须先定义&nbsp;<span style="font-family: 'Courier New';">enum</span>实例。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Color&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;RED("红色",&nbsp;<span style="color: #c00000;">1</span>),&nbsp;GREEN("绿色",&nbsp;<span style="color: #c00000;">2</span>),&nbsp;BLANK("白色",&nbsp;<span style="color: #c00000;">3</span>),&nbsp;YELLO("黄色",&nbsp;<span style="color: #c00000;">4</span>);&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;成员变量</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;String&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;构造方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;Color(String&nbsp;name,&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.index&nbsp;=&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;普通方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">static</span>&nbsp;String&nbsp;getName(<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">for</span>&nbsp;(Color&nbsp;c&nbsp;:&nbsp;Color.values())&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">if</span>&nbsp;(c.getIndex()&nbsp;==&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;c.name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #7f0055;">null</span>;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;get&nbsp;set&nbsp;方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;String&nbsp;getName()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">void</span>&nbsp;setName(String&nbsp;name)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">int</span>&nbsp;getIndex()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">void</span>&nbsp;setIndex(<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.index&nbsp;=&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法四：覆盖枚举的方法</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">下面给出一个toString()方法覆盖的例子。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Color&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;RED("红色",&nbsp;<span style="color: #c00000;">1</span>),&nbsp;GREEN("绿色",&nbsp;<span style="color: #c00000;">2</span>),&nbsp;BLANK("白色",&nbsp;<span style="color: #c00000;">3</span>),&nbsp;YELLO("黄色",&nbsp;<span style="color: #c00000;">4</span>);&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;成员变量</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;String&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;构造方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;Color(String&nbsp;name,&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.index&nbsp;=&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//覆盖方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #646464;">@Override</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;String&nbsp;toString()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #7f0055;">this</span>.index+"_"+<span style="color: #7f0055;">this</span>.name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法五：实现接口</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">所有的枚举都继承自java.lang.Enum类。由于<span style="font-family: 'Courier New';">Java</span>&nbsp;不支持多继承，所以枚举对象不能再继承其他类。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">interface</span>&nbsp;Behaviour&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">void</span>&nbsp;print();&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;getInfo();&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Color&nbsp;<span style="color: #7f0055;">implements</span>&nbsp;Behaviour{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;RED("红色",&nbsp;<span style="color: #c00000;">1</span>),&nbsp;GREEN("绿色",&nbsp;<span style="color: #c00000;">2</span>),&nbsp;BLANK("白色",&nbsp;<span style="color: #c00000;">3</span>),&nbsp;YELLO("黄色",&nbsp;<span style="color: #c00000;">4</span>);&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;成员变量</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;String&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//&nbsp;构造方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">private</span>&nbsp;Color(String&nbsp;name,&nbsp;<span style="color: #7f0055;">int</span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">this</span>.index&nbsp;=&nbsp;index;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="width: auto; border-width: 0px;">//接口方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #646464;">@Override</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;String&nbsp;getInfo()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">return</span>&nbsp;<span style="color: #7f0055;">this</span>.name;&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="width: auto; border-width: 0px;">//接口方法</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #646464;">@Override</span>&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">void</span>&nbsp;print()&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span style="color: #7f0055;">this</span>.index+":"+<span style="color: #7f0055;">this</span>.name);&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法六：使用接口组织枚举</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: black;"><img src="http://softbeta.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-left: 0px; padding-top: 2px; padding-bottom: 2px; border: 1px solid #d1d7dc; color: #2b91af;"><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: #7f0055;">public</span>&nbsp;<span style="color: #7f0055;">interface</span>&nbsp;Food&nbsp;{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Coffee&nbsp;<span style="color: #7f0055;">implements</span>&nbsp;Food{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #7f0055;">enum</span>&nbsp;Dessert&nbsp;<span style="color: #7f0055;">implements</span>&nbsp;Food{&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FRUIT,&nbsp;CAKE,&nbsp;GELATO&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li style="font-size: 1em; margin-left: 38px; padding-right: 0px; border-left-width: 1px; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;">}&nbsp;&nbsp;</li></ol></div>&nbsp;<h2>用法七：关于枚举集合的使用</h2><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复；EnumMap中的key是enum类型，而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述，可以参考JDK文档。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">关于枚举的实现细节和原理请参考：</p><img src ="http://www.blogjava.net/czihong/aggbug/399319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-15 19:57 <a href="http://www.blogjava.net/czihong/articles/399319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM参数设定</title><link>http://www.blogjava.net/czihong/articles/399062.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Thu, 09 May 2013 10:17:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/399062.html</guid><description><![CDATA[<p style="margin: 3px 0px 16px; padding: 0px; background-color: #ffffff;"></p><div><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;"><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;">在Linux或其他UNIX和类UNIX环境下，ps命令想必大家都不陌生，我相信也有不少同学写过 ps aux | grep java | grep -v grep | awk '{print $2}' 这样的管道命令来找出Java进程的pid。常言道，Java并非真的"跨平台"，它自己就是平台。作为平台，当然也有些基本的工具，让我们可以用更简单、更统一，同时又是非侵入的方式来查询进程相关信息。今天我们就来认识一下其中的两个。</p><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;"><strong>jps</strong></p><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;">顾名思义，它对应到UNIX的ps命令。用法如下:</p><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;">jps [ options ] [ hostid ]</p><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;">其中，options可以用 -q (安静) -m (输出传递给main方法的参数) -l (显示完整路径) -v (显示传递给JVM的命令行参数) -V (显示通过flag文件传递给JVM的参数) -J (和其他Java工具类似用于传递参数给命令本身要调用的java进程)；hostid是主机id，默认localhost。</p><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;"><strong>jstat</strong></p><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;">用于输出给定java进程的统计信息。用法如下:</p><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;">jstat -options 可以列出当前JVM版本支持的选项，常见的有 -class (类加载器) -compiler (JIT) -gc (GC堆状态) -gccapacity (各区大小) -gccause (最近一次GC统计和原因) -gcnew (新区统计) -gcnewcapacity (新区大小) -gcold (老区统计) -gcoldcapacity (老区大小) -gcpermcapacity (永久区大小) -gcutil (GC统计汇总) -printcompilation (HotSpot编译统计)</p><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;">假定你要监控的Java进程号是12345，那么<br />jstat -gcutil -t 12345 200 300 即可每200毫秒连续打印300次带有时间戳的GC统计信息。</p><p style="margin: 0px 0px 14px; color: #000000; font-family: 'Trebuchet MS'; font-size: 13px; line-height: 19px;">简单解释一下: -gcutil是传入的option；必选，-t是打印时间戳，是以目标JVM启动时间为起点计算的，可选；12345是vmid/pid，和我们从jps拿到的是一样的，必选；200是监控时间间隔，可选，不提供就意味着单次输出；300是最大输出次数，可选，不提供且监控时间间隔有值的话，就是无限期打印下去。</p><strong><br /><br />jstat</strong></p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. jstat -gc pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以显示gc的信息，查看gc的次数，及时间。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中最后五项，分别是young gc的次数，young gc的时间，full gc的次数，full gc的时间，gc的总时间。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.jstat -gccapacity pid<br /></p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以显示，VM内存中三代（young,old,perm）对象的使用和占用大小，</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如：PGCMN显示的是最小perm的内存使用量，PGCMX显示的是perm的内存最大使用量，</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PGC是当前新生成的perm内存占用量，PC是但前perm内存占用量。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其他的可以根据这个类推， OC是old内纯的占用量。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp; 3.jstat -gcutil pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 统计gc信息统计。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp; 4.jstat -gcnew pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 年轻代对象的信息。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp; 5.jstat -gcnewcapacity pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;年轻代对象的信息及其占用量。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp; 6.jstat -gcold pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old代对象的信息。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp; 7.stat -gcoldcapacity pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old代对象的信息及其占用量。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp; 8.jstat -gcpermcapacity pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perm对象的信息及其占用量。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp; 9.jstat -class pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示加载class的数量，及所占空间等信息。<br />&nbsp;&nbsp;&nbsp;&nbsp; 10.jstat -compiler pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示VM实时编译的数量等信息。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp; 11.stat -printcompilation pid</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前VM执行的信息。</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一些术语的中文解释：</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S0C：年轻代中第一个survivor（幸存区）的容量 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S1C：年轻代中第二个survivor（幸存区）的容量 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S0U：年轻代中第一个survivor（幸存区）目前已使用空间 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S1U：年轻代中第二个survivor（幸存区）目前已使用空间 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EC：年轻代中Eden（伊甸园）的容量 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EU：年轻代中Eden（伊甸园）目前已使用空间 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OC：Old代的容量 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OU：Old代目前已使用空间 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PC：Perm(持久代)的容量 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PU：Perm(持久代)目前已使用空间 (字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YGC：从应用程序启动到采样时年轻代中gc次数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YGCT：从应用程序启动到采样时年轻代中gc所用时间(s)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FGC：从应用程序启动到采样时old代(全gc)gc次数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FGCT：从应用程序启动到采样时old代(全gc)gc所用时间(s)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GCT：从应用程序启动到采样时gc用的总时间(s)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp; NGCMN：年轻代(young)中初始化(最小)的大小 (字节)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp; NGCMX：年轻代(young)的最大容量 (字节)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NGC：年轻代(young)中当前的容量 (字节)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp; OGCMN：old代中初始化(最小)的大小 (字节)&nbsp;</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp; OGCMX：old代的最大容量 (字节)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OGC：old代当前新生成的容量 (字节)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp; PGCMN：perm代中初始化(最小)的大小 (字节)&nbsp;</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp; PGCMX：perm代的最大容量 (字节)&nbsp;&nbsp;&nbsp;</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PGC：perm代当前新生成的容量 (字节)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; S0：年轻代中第一个survivor（幸存区）已使用的占当前容量百分比</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S1：年轻代中第二个survivor（幸存区）已使用的占当前容量百分比</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; E：年轻代中Eden（伊甸园）已使用的占当前容量百分比</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; O：old代已使用的占当前容量百分比</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp; P：perm代已使用的占当前容量百分比</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp; S0CMX：年轻代中第一个survivor（幸存区）的最大容量 (字节)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;S1CMX ：年轻代中第二个survivor（幸存区）的最大容量 (字节)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp; ECMX：年轻代中Eden（伊甸园）的最大容量 (字节)</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DSS：当前需要survivor（幸存区）的容量 (字节)（Eden区已满）</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; TT： 持有次数限制</p><p style="line-height: 25px; margin: 0px; padding: 0px; background-color: #ffffff; color: #454545; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti;">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; MTT ： 最大持有次数限制</p><span style="font-size: 12px; line-height: 16px;"><br /><br /><br /><br /><br /><br /><br />虚拟机中的共划分为三个代：年轻代（Young Generation）、年老点（Old Generation）和持久代（Permanent Generation）。其中持久代主要存放的是Java类的类信息，与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">　　年轻代:</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">　　所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区，两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时，还存活的对象将被复制到Survivor区（两个中的一个），当这个 Survivor区满时，此区的存活对象将被复制到另外一个Survivor区，当这个Survivor去也满了的时候，从第一个Survivor区复制过来的并且此时还存活的对象，将被复制&#8220;年老区(Tenured)&#8221;。需要注意，Survivor的两个区是对称的，没先后关系，所以同一个区中可能同时存在从Eden复制过来对象，和从前一个Survivor复制过来的对象，而复制到年老区的只有从第一个Survivor去过来的对象。而且，Survivor区总有一个是空的。同时，根据程序需要，Survivor区是可以配置为多个的（多于两个），这样可以增加对象在年轻代中的存在时间，减少被放到年老代的可能。</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">　　年老代:</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">　　在年轻代中经历了N次垃圾回收后仍然存活的对象，就会被放到年老代中。因此，可以认为年老代中存放的都是一些生命周期较长的对象。</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">　　持久代:</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">　　用于存放静态文件，如今Java类、方法等。持久代对垃圾回收没有显著影响，但是有些应用可能动态生成或者调用一些class，例如Hibernate 等，在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=&lt;N&gt;进行设置。</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">什么情况下触发垃圾回收：</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">&nbsp; &nbsp; 由于对象进行了分代处理，因此垃圾回收区域、时间也不一样。GC有两种类型：Scavenge GC和Full GC。</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">&nbsp; &nbsp; Scavenge GC</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">&nbsp; &nbsp; 一般情况下，当新对象生成，并且在Eden申请空间失败时，就会触发Scavenge GC，对Eden区域进行GC，清除非存活对象，并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行，不会影响到年老代。因为大部分对象都是从Eden区开始的，同时Eden区不会分配的很大，所以Eden区的GC会频繁进行。因而，一般在这里需要使用速度快、效率高的算法，使Eden去能尽快空闲出来。</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">&nbsp; &nbsp; Full GC</span></div><div><span style="font-size: 12px; line-height: 16px;"><br /></span></div><div><span style="font-size: 12px; line-height: 16px;">&nbsp; &nbsp; 对整个堆进行整理，包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收，所以比Scavenge GC要慢，因此应该尽可能减少Full GC的次数。在对JVM调优的过程中，很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC：</span></div><div style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px;"></div><strong><br /><font face="Verdana, arial, sans-serif"><span style="font-size: 12px; line-height: 16px;">-server -Xmx3000m -Xms3000m -Xmn1200m -Xss256k -XX:SurvivorRatio=8 -XX:PermSize=96m -XX:MaxPermSize=96m -XX:+CMSParallelRemarkEnabled -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection &nbsp;</span></font></strong><strong style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px;">-XX:+CMSClassUnloadingEnabled</strong><font face="Verdana, arial, sans-serif"><span style="font-size: 12px; line-height: 16px;">&nbsp;</span></font><strong style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px;">&nbsp;-XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError&nbsp;</strong><font face="Verdana, arial, sans-serif"><span style="font-size: 12px; line-height: 16px;">-</span></font><strong style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px;">XX:HeapDumpPath=/home/app_admin/logs/oom.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps &nbsp;-Xloggc:/home/app_admin/logs/gc.log</strong><br /><strong style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px;">-Xmx3000m</strong><strong style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px;">：</strong><font face="Verdana, arial, sans-serif"><span style="font-size: 12px; line-height: 16px;">设置JVM最大可用内存为3000M。</span></font><p>&nbsp;</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-Xms3000m</strong><strong>：</strong>设置JVM促使内存为3000M。可设置与-Xmx相同，避免每次gc后JVM重新分配内存。</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-Xmn1200m</strong><strong>：</strong>设置年轻代大小为1200m。整个堆大小=年轻代大小+年老代大小。增大年轻代后，将会减小年老代大小。此值对系统性能影响较大，Sun官方推荐配置为整个堆的3/8。</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-Xss256k</strong><strong>：</strong>&nbsp;设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1024k，以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下，减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的，不能无限生成，经验值在3000~5000左右。</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:PermSize=96m</strong>&nbsp;&nbsp;<strong>-XX:MaxPermSize=96m:</strong>设置持久代大小为64m，根据应用自身class文件大小进行设置，运行时空余量在10%------20%左右。</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:+UseConcMarkSweepGC</strong><strong>：</strong>设置年老代为并发收集。</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:+UseParNewGC:</strong>设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上，JVM会根据系统配置自行设置，所以无需再设置此值。</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:-CMSParallelRemarkEnabled</strong>&nbsp;：If the -XX:+UseParNewGC option is in use the remark pauses may be decreased with the -XX:+CMSParallelRemarkEnabled option.</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:+UseCMSCompactAtFullCollection</strong><strong>：</strong>打开对年老代的压缩。可能会影响性能，但是可以消除碎片(-XX:CMSFullGCsBeforeCompaction=5：由于并发收集器不对内存空间进行压缩、整理，所以运行一段时间以后会产生"碎片"，使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理, 避免每次压缩性能消耗)</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">*-XX:+CMSClassUnloadingEnabled:*Perm Gen的使用到达一定的比率(默认为92% ) 出发cms回收</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:+DisableExplicitGC</strong>：屏蔽system.gc(), 这种显示调用垃圾回收</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:+HeapDumpOnOutOfMemoryError</strong>：内存溢出打印堆栈信息</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:HeapDumpPath=/home/app_admin/logs/oom.log</strong>：heapdump的日志文件路径</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:+PrintGCDetails</strong>：打印gc日志详情</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-XX:+PrintGCDateStamps</strong>：打印gc时的具体时间</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>-Xloggc:/home/app_admin/logs/gc.log</strong>：gc打印日志文件的路径</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>JVM</strong><strong>内存结构</strong><br clear="all" /><img src="http://wiki.corp.tudou.com:8080/confluence/download/attachments/26382681/1.png" align="absmiddle" border="0" alt="" /><br />&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method Area------方法区，被Class Loader所装载的class文件以及相关的方法信息、域信息、静态变量等都存放在这个区域内。该区域是所有Java线程所共享的。(设置方法区内存大小:-XX:PermSize -XX:MaxPermSize)</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Heap------堆区，这个区域就是用来存放java对象的，通常GC也是针对该区域。一个Java虚拟机实例只有一个堆，并直接由java虚拟机进行管理，在虚拟机启动时创建。该区域可以被所有Java线程所共享。(设置堆内存大小:-Xms&nbsp; -Xmx -Xmn)</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack------栈区，用来存放JVM的内存局部变量和操作数栈。通常虚拟机对它的操作比较简单（以帧为单位的压栈和出栈），速度也很快。每个线程都有自己的栈，且栈可以不连续。(设置栈内存大小:-Xss)</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Program Counter Register------每一个线程都有自己的一个PC寄存器，用于存放下一条被执行的指令的地址。每个线程的PC寄存器在线程启动时产生。</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Native Method Stack------保存本地方法进入区域的地址。(设置栈内存大小:-Xss)<br />&nbsp;&nbsp;<br clear="all" /><br clear="all" /><img src="http://wiki.corp.tudou.com:8080/confluence/download/attachments/26382681/2.png" align="absmiddle" border="0" alt="" /><br clear="all" /><br clear="all" /><br clear="all" /><br clear="all" /><br clear="all" /><strong>GC</strong><strong>日志格式说明：</strong></p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">[GC [&lt;collector&gt;: &lt;starting occupancy1&gt; -&gt; &lt;ending occupancy1&gt;, &lt;pause time1&gt; secs] &lt;starting occupancy3&gt; -&gt; &lt;ending occupancy3&gt;, &lt;pause time3&gt; secs]</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&lt;collector&gt;GC收集器的名称</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&lt;starting occupancy1&gt;&nbsp;新生代在GC前占用的内存</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&lt;ending occupancy1&gt;&nbsp;新生代在GC后占用的内存</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&lt;pause time1&gt;&nbsp;新生代局部收集时jvm暂停处理的时间</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&lt;starting occupancy3&gt; JVM Heap&nbsp;在GC前占用的内存</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&lt;ending occupancy3&gt; JVM Heap&nbsp;在GC后占用的内存</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">&lt;pause time3&gt; GC过程中jvm暂停处理的总时间</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">YGC收集信息</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">2012-2-7T19:24:29.040+0800: 10429.503: [GC [PSYoungGen: 484520K-&gt;2577K(495936K)] 734774K-&gt;254308K(3129664K), 0.0118730 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">FGC收集信息</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">2012-2-7T19:38:37.391+0800: 10804.897: [Full GC (System) [PSYoungGen: 684K-&gt;0K(468416K)] [PSOldGen: 342164K-&gt;257451K(1060864K)] 342849K-&gt;257451K(1529280K) [PSPermGen: 123775K-&gt;122206K(237248K)], 1.1808050 secs] [Times: user=0.99 sys=0.18, real=1.18 secs]&nbsp;<br clear="all" /></p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;"><strong>JVM</strong><strong>运行期分析工具</strong></p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">jps 虚拟机进程状况工具</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">jinfo java配置信息工具</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">jstat 虚拟机统计信息监视工具</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">jmap java内存映射工具</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">jhat 虚拟机堆转储快照分析工具</p><p style="font-family: Verdana, arial, sans-serif; font-size: 12px; line-height: 16px; margin: 16px 0px; padding: 0px; background-color: #ffffff;">jstack java堆栈跟踪工具&nbsp;</p><img src ="http://www.blogjava.net/czihong/aggbug/399062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-09 18:17 <a href="http://www.blogjava.net/czihong/articles/399062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring mvc singleton的验证</title><link>http://www.blogjava.net/czihong/articles/398806.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sun, 05 May 2013 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398806.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398806.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398806.html</trackback:ping><description><![CDATA[用了Spring MVC有一个多月了，之前虽然有接触过一些，但是一直没有在实际工作中使用。今天和同事聊起，谈到Spring MVC中的Controller是单例实现的，于是就写了一段代码验证一些。<br /><br />1. 如果是单例的，那么在Controller类中的实例变量应该是共享的，如果不共享，则说明不是单例。<br />直接代码：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Controller<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DemoAction&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;i&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/singleton")<br />&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;singleton(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InterruptedException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;addInt&nbsp;=&nbsp;Integer.parseInt(request.getParameter("int"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;i&nbsp;+&nbsp;addInt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;String.valueOf(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />分别三次请求： localhost：8080/projectname/singleton？int=5<br />得到的返回结果如下。<br />第一次： i=5<br />第二次： i=10<br />第三次： i=15<br /><br />重结果可以得知，i的状态是共享的，因此Controller是单例的。<br /><br />-------------------------------------------------------------------------------------------------------------------------<br />2. 如果是单例，那么多个线程请求同一个Controller类中的同一个方法，线程是否会堵塞？<br />验证代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp; &nbsp; @RequestMapping(value&nbsp;=&nbsp;"/switcher")<br />&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;switcher(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InterruptedException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;switcher&nbsp;=&nbsp;request.getParameter("switcher");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(switcher.equals("on"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.currentThread().sleep(10000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"switch&nbsp;on";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;switcher;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />验证方法：<br />分别发送两个请求，<br />第一个请求：localhost：8080/projectname/singleton？switcher=on<br />第二个请求：localhost：8080/projectname/singleton？switcher=everything<br /><br />验证结果：<br />第一个请求发出去以后，本地服务器等待10s，然后返回结果&#8220;switch on&#8221;,<br />在本地服务器等待的者10s当中，第二期的请求，直接返回结果&#8220;everything&#8221;。说明之间的线程是不互相影响的。<br />-------------------------------------------------------------------------------------------------------------------------<br />3.既然Controller是单例的，那么Service是单例的吗？验证方法和Controller的单例是一样的。<br />验证代码：<br />Controller:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />--><div style="display: inline-block;">@Controller<br /><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span>&nbsp;DemoAction&nbsp;{<br /><br /><div>&nbsp;&nbsp;&nbsp;&nbsp;@Resource</div><div>&nbsp;&nbsp;&nbsp;&nbsp;private DemoService demoService;</div><br />&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/service")<br />&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">public</span>&nbsp;String&nbsp;service(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">throws</span>&nbsp;InterruptedException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">int</span>&nbsp;result&nbsp;=&nbsp;demoService.addService(5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span>&nbsp;String.valueOf(result);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div>&nbsp; &nbsp;&nbsp;</div>Service:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->@Service<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DemoService&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;addService(<span style="color: #0000FF; ">int</span>&nbsp;num){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;i&nbsp;+&nbsp;num;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />分别三次请求： localhost：8080/projectname/service<br />得到的返回结果如下。<br />第一次： i=5<br />第二次： i=10<br />第三次： i=15<br /><br />重结果可以得知，i的状态是共享的，因此Service默认是单例的。<br />-------------------------------------------------------------------------------------------------------------------------<br />相同的验证方法，可以得出@Repository的DAO也是默认单例。<br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/czihong/aggbug/398806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-05 13:49 <a href="http://www.blogjava.net/czihong/articles/398806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java关键字final、static使用总结</title><link>http://www.blogjava.net/czihong/articles/398788.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 04 May 2013 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398788.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398788.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398788.html</trackback:ping><description><![CDATA[Refer to:&nbsp;<a href="http://java.chinaitlab.com/base/724785.html">http://java.chinaitlab.com/base/724785.html</a><br /><br /><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px; word-wrap: break-word;">一、final</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　根据程序上下文环境，<a href="http://java.chinaitlab.com/" target="_blank" style="margin: 0px; padding: 0px; word-wrap: break-word; text-decoration: none; color: #0000ff; line-height: 22px;">Java</a>关键字final有&#8220;这是无法改变的&#8221;或者&#8220;终态的&#8221;含义，它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变：设计或效率。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />final类不能被继承，没有子类，final类中的方法默认是final的。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />final方法不能被子类的方法覆盖，但可以被继承。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />final成员变量表示常量，只能被赋值一次，赋值后值不再改变。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />final不能用于修饰构造方法。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />注意：父类的private成员方法是不能被子类方法覆盖的，因此private类型的方法默认是final类型的。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><strong style="margin: 0px; padding: 0px; word-wrap: break-word;">1、final类</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　final类不能被继承，因此final类的成员方法没有机会被覆盖，默认都是final的。在设计类时候，如果这个类不需要有子类，类的实现细节不允许改变，并且确信这个类不会载被扩展，那么就设计为final类。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />2、final方法&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />如果一个类不允许其子类覆盖某个方法，则可以把这个方法声明为final方法。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><strong style="margin: 0px; padding: 0px; word-wrap: break-word;">使用final方法的原因有二：</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />第一、把方法锁定，防止任何继承类修改它的意义和实现。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />第二、高效。编译器在遇到调用final方法时候会转入内嵌机制，大大提高执行效率。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />例如：</p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"></p><table bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="" style="margin: 0px auto; padding: 0px; word-wrap: break-word; font-size: 12px; color: #333333; line-height: 18px; background-color: #cccccc; width: 532px; font-family: 宋体;"><tbody style="margin: 0px; padding: 0px; word-wrap: break-word;"><tr style="margin: 0px; padding: 0px; word-wrap: break-word;"><td style="margin: 0px; padding: 0px 0px 0px 5px; word-wrap: break-word; background-color: #f2f2f2; font-family: Verdana, Arial, Helvetica, sans-serif;">public class Test1 {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public static void main(String[] args) {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />// TODO 自动生成方法存根&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public void f1() {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println("f1");&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//无法被子类覆盖的方法&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public final void f2() {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println("f2");&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public void f3() {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println("f3");&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />private void f4() {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println("f4");&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public class Test2 extends Test1 {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public void f1(){&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println("Test1父类方法f1被覆盖!");&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public static void main(String[] args) {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />Test2 t=new Test2();&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />t.f1();&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />t.f2(); //调用从父类继承过来的final方法&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />t.f3(); //调用从父类继承过来的方法&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//t.f4(); //调用失败，无法从父类继承获得&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;</td></tr></tbody></table><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><strong style="margin: 0px; padding: 0px; word-wrap: break-word;">3、final变量（常量）</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　用final修饰的成员变量表示常量，值一旦给定就无法改变！&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　final修饰的变量有三种：静态变量、实例变量和局部变量，分别表示三种类型的常量。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　从下面的例子中可以看出，一旦给final变量初值后，值就不能再改变了。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　另外，final变量定义的时候，可以先声明，而不给初值，这中变量也称为final空白，无论什么情况，编译器都确保空白final在使用之前必须被初始化。但是，final空白在final关键字final的使用上提供了更大的灵活性，为此，一个类中的final数据成员就可以实现依对象而有所不同，却有保持其恒定不变的特征。</p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"></p><table bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="" style="margin: 0px auto; padding: 0px; word-wrap: break-word; font-size: 12px; color: #333333; line-height: 18px; background-color: #cccccc; width: 532px; font-family: 宋体;"><tbody style="margin: 0px; padding: 0px; word-wrap: break-word;"><tr style="margin: 0px; padding: 0px; word-wrap: break-word;"><td style="margin: 0px; padding: 0px 0px 0px 5px; word-wrap: break-word; background-color: #f2f2f2; font-family: Verdana, Arial, Helvetica, sans-serif;">package org.leizhimin;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public class Test3 {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />private final String S="final实例变量S";&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />private final int A=100;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public final int B=90;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public static final int C=80;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />private static final int D=70;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public final int E; //final空白,必须在初始化对象的时候赋初值&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public Test3(int x){&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />E=x;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />/**&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />* @param args&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />*/&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public static void main(String[] args) {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />Test3 t=new Test3(2);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//t.A=101; //出错,final变量的值一旦给定就无法改变&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//t.B=91; //出错,final变量的值一旦给定就无法改变&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//t.C=81; //出错,final变量的值一旦给定就无法改变&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//t.D=71; //出错,final变量的值一旦给定就无法改变&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(t.A);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(t.B);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(t.C); //不推荐用对象方式访问静态字段&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(t.D); //不推荐用对象方式访问静态字段&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(Test3.C);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(Test3.D);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//System.out.println(Test3.E); //出错,因为E为final空白,依据不同对象值有所不同.&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(t.E);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />Test3 t1=new Test3(3);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(t1.E); //final空白变量E依据对象的不同而不同&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />private void test(){&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(new Test3(1).A);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(Test3.C);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(Test3.D);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public void test2(){&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />final int a; //final空白,在需要的时候才赋值&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />final int b=4; //局部常量--final用于局部变量的情形&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />final int c; //final空白,一直没有给赋值.&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />a=3;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//a=4; 出错,已经给赋过值了.&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//b=2; 出错,已经给赋过值了.&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;</td></tr></tbody></table><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"></p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;">&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><strong style="margin: 0px; padding: 0px; word-wrap: break-word;">4、final参数</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />当函数参数为final类型时，你可以读取使用该参数，但是无法改变该参数的值。</p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"></p><table bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="" style="margin: 0px auto; padding: 0px; word-wrap: break-word; font-size: 12px; color: #333333; line-height: 18px; background-color: #cccccc; width: 532px; font-family: 宋体;"><tbody style="margin: 0px; padding: 0px; word-wrap: break-word;"><tr style="margin: 0px; padding: 0px; word-wrap: break-word;"><td style="margin: 0px; padding: 0px 0px 0px 5px; word-wrap: break-word; background-color: #f2f2f2; font-family: Verdana, Arial, Helvetica, sans-serif;">public class Test4 {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public static void main(String[] args) {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />new Test4().f1(2);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public void f1(final int i){&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />//i++; //i是final类型的,值不允许改变的.&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.print(i);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br /><br /></td></tr></tbody></table><br /><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px; word-wrap: break-word;">二、static</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　static表示&#8220;全局&#8221;或者&#8220;静态&#8221;的意思，用来修饰成员变量和成员方法，也可以形成静态static代码块，但是<a href="http://java.chinaitlab.com/" target="_blank" style="margin: 0px; padding: 0px; word-wrap: break-word; text-decoration: none; color: #0000ff; line-height: 22px;">Java</a>语言中没有全局变量的概念。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说，它不依赖类特定的实例，被类的所有实例共享。只要这个类被加载，Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此，static对象可以在它的任何对象创建之前访问，无需引用任何对象。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　用public修饰的static成员变量和成员方法本质是全局变量和全局方法，当声明它类的对象市，不生成static变量的副本，而是类的所有实例共享同一个static变量。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　static变量前可以有private修饰，表示这个变量可以在类的静态代码块中，或者类的其他静态成员方法中使用（当然也可以在非静态成员方法中使用--废话），但是不能在其他类中通过类名来直接引用，这一点很重要。实际上你需要搞明白，private是访问权限限定，static表示不要实例化就可以使用，这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　static修饰的成员变量和成员方法习惯上称为静态变量和静态方法，可以直接通过类名来访问，访问语法为：&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />类名.静态方法名(参数列表...)&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />类名.静态变量名&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　用static修饰的代码块表示静态代码块，当Java虚拟机（JVM）加载类时，就会执行该代码块（用处非常大，呵呵）。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><strong style="margin: 0px; padding: 0px; word-wrap: break-word;">1、static变量</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　按照是否静态的对类成员变量进行分类可分两种：一种是被static修饰的变量，叫静态变量或类变量；另一种是没有被static修饰的变量，叫实例变量。两者的区别是：&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　对于静态变量在内存中只有一个拷贝（节省内存），JVM只为静态分配一次内存，在加载类的过程中完成静态变量的内存分配，可用类名直接访问（方便），当然也可以通过对象来访问（但是这是不推荐的）。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　对于实例变量，没创建一个实例，就会为实例变量分配一次内存，实例变量可以在内存中有多个拷贝，互不影响（灵活）。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><strong style="margin: 0px; padding: 0px; word-wrap: break-word;">2、静态方法</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　静态方法可以直接通过类名调用，任何的实例也都可以调用，因此静态方法中不能用this和super关键字，不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法)，只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联！这个需要去理解，想明白其中的道理，不是记忆！！！&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　因为static方法独立于任何实例，因此static方法必须被实现，而不能是抽象的abstract。&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><strong style="margin: 0px; padding: 0px; word-wrap: break-word;">3、static代码块</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />　static代码块也叫静态代码块，是在类中独立于类成员的static语句块，可以有多个，位置可以随便放，它不在任何的方法体内，JVM加载类时会执行这些静态的代码块，如果static代码块有多个，JVM将按照它们在类中出现的先后顺序依次执行它们，每个代码块只会被执行一次。例如：</p><p style="margin: 10px 0px 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;"></p><table bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="" style="margin: 0px auto; padding: 0px; word-wrap: break-word; font-size: 12px; color: #333333; line-height: 18px; background-color: #cccccc; width: 532px; font-family: 宋体;"><tbody style="margin: 0px; padding: 0px; word-wrap: break-word;"><tr style="margin: 0px; padding: 0px; word-wrap: break-word;"><td style="margin: 0px; padding: 0px 0px 0px 5px; word-wrap: break-word; background-color: #f2f2f2; font-family: Verdana, Arial, Helvetica, sans-serif;">public class Test5 {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />private static int a;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />private int b;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word;" />static{&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />Test5.a=3;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(a);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />Test5 t=new Test5();&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />t.f();&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />t.b=1000;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(t.b);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />static{&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />Test5.a=4;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(a);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public static void main(String[] args) {&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />// TODO 自动生成方法存根&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />static{&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />Test5.a=5;&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println(a);&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />public void f(){&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />System.out.println("hhahhahah");&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word;" />}&nbsp;</td></tr></tbody></table>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">运行结果：&nbsp;</span><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">3&nbsp;</span><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">hhahhahah&nbsp;</span><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">1000&nbsp;</span><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">4&nbsp;</span><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">5&nbsp;</span><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">　利用静态代码块可以对一些static变量进行赋值，最后再看一眼这些例子，都一个static的main方法，这样JVM在运行main方法的时候可以直接调用而不用创建实例。&nbsp;</span><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><strong style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;">4、static和final一块用表示什么</strong>&nbsp;<br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">static final用来修饰成员变量和成员方法，可简单理解为&#8220;全局常量&#8221;！&nbsp;</span><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">对于变量，表示一旦给值就不可修改，并且通过类名可以访问。&nbsp;</span><br style="margin: 0px; padding: 0px; word-wrap: break-word; font-family: 宋体; line-height: 25px; background-color: #ffffff;" /><span style="font-family: 宋体; line-height: 25px; background-color: #ffffff;">对于方法，表示不可覆盖，并且可以通过类名直接访问。</span><img src ="http://www.blogjava.net/czihong/aggbug/398788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-04 15:10 <a href="http://www.blogjava.net/czihong/articles/398788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Quartz Corn Expression</title><link>http://www.blogjava.net/czihong/articles/398748.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 03 May 2013 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398748.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398748.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398748.html</trackback:ping><description><![CDATA[<h2><span style="color: #555555; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 13px; font-weight: normal; line-height: 20px; background-color: #f9f9f9;">&nbsp;Refer to:&nbsp;</span><a href="http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger" style="font-weight: normal; font-size: 14px;">http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger</a><br /><br />Introduction</h2><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">cron</tt>&nbsp;is a UNIX tool that has been around for a long time, so its scheduling capabilities are powerful and proven. The<tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">CronTrigger</tt>&nbsp;class is based on the scheduling capabilities of cron.</p><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">CronTrigger</tt>&nbsp;uses "cron expressions", which are able to create firing schedules such as: "At 8:00am every Monday through Friday" or "At 1:30am every last Friday of the month".</p><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;">Cron expressions are powerful, but can be pretty confusing. This tutorial aims to take some of the mystery out of creating a cron expression, giving users a resource which they can visit before having to ask in a forum or mailing list.</p><h2>Format</h2><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;">A cron expression is a string comprised of 6 or 7 fields separated by white space. Fields can contain any of the allowed values, along with various combinations of the allowed special characters for that field. The fields are as follows:</p><table cellpadding="3" cellspacing="1" style="margin: 0px 0px 18px; padding: 0px; border-style: solid; border-color: #eeeeee; font-size: 13px; line-height: 1; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; border-collapse: collapse; border-spacing: 0px; background-color: white; width: 697px; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; -webkit-box-shadow: none; box-shadow: none; color: #555555;"><thead style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit; background-color: #555555;"><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><th style="margin: 0px; padding: 0.3em 0.5em; border: 0px; font-size: 14px; line-height: 18px; font-family: inherit; color: white; background-color: #666666; border-top-left-radius: 6px;">Field Name</th><th style="margin: 0px; padding: 0.3em 0.5em; border: 0px; font-size: 14px; line-height: 18px; font-family: inherit; color: white; background-color: #666666;">Mandatory</th><th style="margin: 0px; padding: 0.3em 0.5em; border: 0px; font-size: 14px; line-height: 18px; font-family: inherit; color: white; background-color: #666666;">Allowed Values</th><th style="margin: 0px; padding: 0.3em 0.5em; border: 0px; font-size: 14px; line-height: 18px; font-family: inherit; color: white; background-color: #666666; border-top-right-radius: 6px;">Allowed Special Characters</th></tr></thead><tbody style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Seconds</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">YES</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">0-59</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">, - * /</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Minutes</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">YES</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">0-59</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">, - * /</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Hours</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">YES</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">0-23</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">, - * /</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Day of month</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">YES</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">1-31</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">, - * ? / L W<br clear="all" /></td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Month</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">YES</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">1-12 or JAN-DEC</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">, - * /</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Day of week</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">YES</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">1-7 or SUN-SAT</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">, - * ? / L #</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Year</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">NO</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">empty, 1970-2099</td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">, - * /</td></tr></tbody></table><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;">So cron expressions can be as simple as this:&nbsp;<tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">* * * * ? *</tt></p><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;">or more complex, like this:&nbsp;<tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0/5 14,18,3-39,52 * ? JAN,MAR,SEP MON-FRI 2002-2010</tt></p><h2>Special characters</h2><ul style="margin: 0px 0px 18px 2em; padding: 0px; border: 0px; font-size: 13px; line-height: 1; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;"><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;"><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; line-height: 20px; font-family: inherit;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><strong style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">*</strong></tt>&nbsp;(<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"all values"</em>) - used to select all values within a field. For example, "<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">" in the minute field means *"every minute"</em>.</p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;"><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; line-height: 20px; font-family: inherit;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><strong style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">?</strong></tt>&nbsp;(<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"no specific value"</em>) - useful when you need to specify something in one of the two fields in which the character is allowed, but not the other. For example, if I want my trigger to fire on a particular day of the month (say, the 10th), but don't care what day of the week that happens to be, I would put "10" in the day-of-month field, and "?" in the day-of-week field. See the examples below for clarification.</p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;"><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; line-height: 20px; font-family: inherit;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><strong style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">-</strong></tt>&nbsp;- used to specify ranges. For example, "10-12" in the hour field means&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"the hours 10, 11 and 12"</em>.</p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;"><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; line-height: 20px; font-family: inherit;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><strong style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">,</strong></tt>&nbsp;- used to specify additional values. For example, "MON,WED,FRI" in the day-of-week field means&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"the days Monday, Wednesday, and Friday"</em>.</p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;"><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; line-height: 20px; font-family: inherit;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><strong style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">/</strong></tt>&nbsp;- used to specify increments. For example, "0/15" in the seconds field means&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"the seconds 0, 15, 30, and 45"</em>. And "5/15" in the seconds field means&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"the seconds 5, 20, 35, and 50"</em>. You can also specify '/' after the '<strong style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">' character - in this case '</strong>' is equivalent to having '0' before the '/'. '1/3' in the day-of-month field means&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"fire every 3 days starting on the first day of the month"</em>.</p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;"><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; line-height: 20px; font-family: inherit;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><strong style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">L</strong></tt>&nbsp;(<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"last"</em>) - has different meaning in each of the two fields in which it is allowed. For example, the value "L" in the day-of-month field means&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"the last day of the month"</em>&nbsp;- day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself, it simply means "7" or "SAT". But if used in the day-of-week field after another value, it means&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"the last xxx day of the month"</em>&nbsp;- for example "6L" means&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"the last friday of the month"</em>. When using the 'L' option, it is important not to specify lists, or ranges of values, as you'll get confusing results.</p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;"><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; line-height: 20px; font-family: inherit;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><strong style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">W</strong></tt>&nbsp;(<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"weekday"</em>) - used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the day-of-month field, the meaning is:&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"the nearest weekday to the 15th of the month"</em>. So if the 15th is a Saturday, the trigger will fire on Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. However if you specify "1W" as the value for day-of-month, and the 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not 'jump' over the boundary of a month's days. The 'W' character can only be specified when the day-of-month is a single day, not a range or list of days.</p></li></ul><blockquote style="margin: 0px 0px 20px 20px; padding: 0px 20px 0px 19px; border-width: 0px 0px 0px 1px; border-left-color: #dddddd; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #666666; background-color: #f9f9f9;">The 'L' and 'W' characters can also be combined in the day-of-month field to yield 'LW', which translates to *"last weekday of the month"*.</blockquote><ul style="margin: 0px 0px 18px 2em; padding: 0px; border: 0px; font-size: 13px; line-height: 1; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;"><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><strong style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">#</strong></tt>&nbsp;- used to specify "the nth" XXX day of the month. For example, the value of "6#3" in the day-of-week field means<em style="margin: 0px; padding: 0px; border: 0px; line-height: inherit; font-family: inherit;">"the third Friday of the month"</em>&nbsp;(day 6 = Friday and "#3" = the 3rd one in the month). Other examples: "2#1" = the first Monday of the month and "4#5" = the fifth Wednesday of the month. Note that if you specify "#5" and there is not 5 of the given day-of-week in the month, then no firing will occur that month.</li></ul><blockquote style="margin: 0px 0px 20px 20px; padding: 0px 20px 0px 19px; border-width: 0px 0px 0px 1px; border-left-color: #dddddd; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #666666; background-color: #f9f9f9;">The legal characters and the names of months and days of the week are not case sensitive.&nbsp;<tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">MON</tt>&nbsp;is the same as&nbsp;<tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">mon</tt>.</blockquote><h2>Examples</h2><p style="margin: 0px 0px 18px; padding: 0px; border: 0px; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;">Here are some full examples:</p><table cellpadding="3" cellspacing="1" style="margin: 0px 0px 18px; padding: 0px; border-style: solid; border-color: #eeeeee; font-size: 13px; line-height: 1; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; border-collapse: collapse; border-spacing: 0px; background-color: white; width: 697px; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; -webkit-box-shadow: none; box-shadow: none; color: #555555;"><thead style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit; background-color: #555555;"><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><th width="150" style="margin: 0px; padding: 0.3em 0.5em; border: 0px; font-size: 14px; line-height: 18px; font-family: inherit; color: white; background-color: #666666; border-top-left-radius: 6px;">Expression</th><th style="margin: 0px; padding: 0.3em 0.5em; border: 0px; font-size: 14px; line-height: 18px; font-family: inherit; color: white; background-color: #666666; border-top-right-radius: 6px;">Meaning</th></tr></thead><tbody style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;"><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 0 12 * * ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 12pm (noon) every day</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 ? * *</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am every day</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 * * ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am every day</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 * * ? *</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am every day</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 * * ? 2005</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am every day during the year 2005</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 * 14 * * ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire every minute starting at 2pm and ending at 2:59pm, every day</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 0/5 14 * * ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 0/5 14,18 * * ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 0-5 14 * * ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire every minute starting at 2pm and ending at 2:05pm, every day</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 10,44 14 ? 3 WED</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 ? * MON-FRI</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 15 * ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am on the 15th day of every month</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 L * ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am on the last day of every month</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 ? * 6L</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am on the last Friday of every month</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 ? * 6L</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am on the last Friday of every month</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 ? * 6L 2002-2005</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 15 10 ? * 6#3</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 10:15am on the third Friday of every month</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 0 12 1/5 * ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.</td></tr><tr style="margin: 0px; padding: 0px; border-width: 0px 0px 1px; border-bottom-style: solid; border-bottom-color: #eeeeee; line-height: 1; font-family: inherit;"><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;"><tt style="margin: 0px; padding: 0px; border: 0px; line-height: 1; font-family: inherit;">0 11 11 11 11 ?</tt></td><td style="margin: 0px; padding: 9px 10px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-style: solid; border-left-color: #dddddd; line-height: 1.3; font-family: inherit; color: #333333; vertical-align: top;">Fire every November 11th at 11:11am.</td></tr></tbody></table><blockquote style="margin: 0px 0px 20px 20px; padding: 0px 20px 0px 19px; border-width: 0px 0px 0px 1px; border-left-color: #dddddd; font-size: 13px; line-height: 20px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #666666; background-color: #f9f9f9;">Pay attention to the effects of '?' and '*' in the day-of-week and day-of-month fields!</blockquote><h2>Notes</h2><ul style="margin: 0px 0px 18px 2em; padding: 0px; border: 0px; font-size: 13px; line-height: 1; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; color: #555555; background-color: #f9f9f9;"><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;">Support for specifying both a day-of-week and a day-of-month value is not complete (you must currently use the '?' character in one of these fields).</li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; line-height: 18px; font-family: inherit;">Be careful when setting fire times between mid-night and 1:00 AM - "daylight savings" can cause a skip or a repeat depending on whether the time moves back or jumps forward.</li></ul><img src ="http://www.blogjava.net/czihong/aggbug/398748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-05-03 16:56 <a href="http://www.blogjava.net/czihong/articles/398748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jps介绍以及解决jps无法查看某个已经启动的java进程问题</title><link>http://www.blogjava.net/czihong/articles/398460.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 26 Apr 2013 11:35:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398460.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398460.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398460.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><strong><span style="font-size: medium;">1、jps的作用</span></strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="white-space: pre;">	</span>jps类似linux的ps命令，不同的是ps是用来显示进程，而<strong><span style="color: #ff0000;">jps只显示java进程，准确的说是当前用户已启动的部分java进程信息，信息包括进程号和简短的进程command。</span></strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><strong><span style="font-size: medium;">2、某个java进程已经启动，用jps却显示不了该进程进程号</span></strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="white-space: pre;">	</span>这个问题已经碰到过两次了，所以在这里总结下。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><strong>现象：</strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="color: #ff0000;"><strong><span style="white-space: pre;">	</span>用ps -ef|grep java能看到启动的java进程，但是用jps查看却不存在该进程的id</strong></span>。待会儿解释过之后就能知道在该情况下，<strong><span style="color: #ff0000;">jconsole、jvisualvm可能无法监控该进程，其他java自带工具也可能无法使用</span></strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><strong>分析：</strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="white-space: pre;">	</span>java程序启动后，默认（请注意是默认）会在<strong><span style="color: #ff0000;">/tmp/hsperfdata_userName目录下以该进程的id为文件名</span></strong>新建文件，并<strong><span style="color: #ff0000;">在该文件中存储jvm运行的相关信息</span></strong>，其中的userName为当前的用户名，/tmp/hsperfdata_userName目录会存放该用户所有已经启动的java进程信息。对于windows机器/tmp用Windows存放临时文件目录代替。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="white-space: pre;">	</span>而jps、jconsole、jvisualvm等工具的数据来源就是这个文件（<strong>/tmp/hsperfdata_userName/pid)</strong>。所以<strong><span style="color: #ff0000;">当该文件不存在或是无法读取时就会出现jps无法查看该进程号，jconsole无法监控等问题</span></strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><strong>原因：</strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">（1）、<strong>磁盘读写、目录权限问题</strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="white-space: pre;">	</span>若该用户没有权限写/tmp目录或是磁盘已满，则无法创建<strong>/tmp/hsperfdata_userName/pid</strong>文件。或该文件已经生成，但用户没有读权限</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">（2）、<strong>临时文件丢失，被删除或是定期清理</strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="white-space: pre;">	</span>对于linux机器，一般都会存在定时任务对临时文件夹进行清理，导致/tmp目录被清空。这也是我第一次碰到该现象的原因。常用的可能定时删除临时目录的工具为crontab、redhat的tmpwatch、ubuntu的tmpreaper等等</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">这个导致的现象可能会是这样，用jconsole监控进程，发现在某一时段后进程仍然存在，但是却没有监控信息了。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">（3）、<strong>java进程信息文件存储地址被设置，不在/tmp目录下</strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="white-space: pre;">	</span>上面我们在介绍时说默认会在<strong>/tmp/hsperfdata_userName目录</strong>保存进程信息，但由于以上1、2所述原因，可能导致该文件无法生成或是丢失，所以java启动时提供了参数(<span style="line-height: 25px;">-Djava.io.tmpdir)</span>，可以对这个文件的位置进行设置，而jps、jconsole都只会从/tmp目录读取，而无法从设置后的目录读物信息，这是我第二次碰到该现象的原因</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">关于设置该文件位置的参数为<strong>-Djava.io.tmpdir</strong></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">其他：</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><strong>/tmp/hsperfdata_userName/pid</strong>文件会在<strong>对应java进程退出后被清除</strong>。如果java进程非正常退出（如kill -9），那么pid文件会被保留，直到执行一次java命令或是加载了jvm程序的命令（如jps、javac、jstat），会将所有无用的pid文件都清除掉</p><img src ="http://www.blogjava.net/czihong/aggbug/398460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-04-26 19:35 <a href="http://www.blogjava.net/czihong/articles/398460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于memcache取多值的性能比较</title><link>http://www.blogjava.net/czihong/articles/398444.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 26 Apr 2013 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398444.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398444.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398444.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398444.html</trackback:ping><description><![CDATA[测试代码<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp; &nbsp; &nbsp; &nbsp; List&lt;Integer&gt;&nbsp;lids&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Integer&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10000;&nbsp;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lids.add(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lids.add(8700);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lids.add(8703);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;Integer,&nbsp;Integer&gt;&nbsp;map&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;startTime&nbsp;=&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;=&nbsp;playlistServiceClient.getPlaylistPlaytimsByLids(lids);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;endTime&nbsp;=&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info((endTime&nbsp;-&nbsp;startTime)&nbsp;&nbsp;+&nbsp;" millseconds");</div>一次性去memcache多值的代码<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp; &nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取豆单的历史播发总数<br />&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;lid<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;豆单ID<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;个数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;getPlaylistPlaytimsByLid(<span style="color: #0000FF; ">int</span>&nbsp;lid)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;cacheResult&nbsp;=&nbsp;ptsMemcacheClient.get(PLAYLIST_PTS_KEY_PL_HIS_PT&nbsp;+&nbsp;lid);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;PLAYLIST_PTS_KEY_PL_HIS_PT&nbsp;+&nbsp;lid;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cacheResult&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Integer.parseInt((String)&nbsp;cacheResult);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取豆单列表的历史播发总数<br />&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;lids<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;豆单ID列表<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;个数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Map&lt;Integer,&nbsp;Integer&gt;&nbsp;getPlaylistPlaytimsByLids(List&lt;Integer&gt;&nbsp;lids)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(CollectionUtils.isEmpty(lids))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Collections.EMPTY_MAP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;Integer,&nbsp;Integer&gt;&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;Integer,&nbsp;Integer&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;lids.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;keys&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String[lids.size()];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keys[i]&nbsp;=&nbsp;PLAYLIST_PTS_KEY_PL_HIS_PT&nbsp;+&nbsp;lids.get(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String,&nbsp;Object&gt;&nbsp;cacheMap&nbsp;=&nbsp;ptsMemcacheClient.getMulti(keys);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;value&nbsp;=&nbsp;cacheMap.get(PLAYLIST_PTS_KEY_PL_HIS_PT&nbsp;+&nbsp;lids.get(i));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put(lids.get(i),&nbsp;(value&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;?&nbsp;-1&nbsp;:&nbsp;Integer.parseInt((String)&nbsp;value));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div>性能<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp;2013-04-26&nbsp;15:09:22&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;lid&nbsp;:&nbsp;99<br />&nbsp;2013-04-26&nbsp;15:09:22&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;99:&nbsp;-1<br />&nbsp;2013-04-26&nbsp;15:09:22&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;363 millseconds<br />&nbsp;2013-04-26&nbsp;15:09:33&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;lid&nbsp;:&nbsp;8700<br />&nbsp;2013-04-26&nbsp;15:09:33&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;8700:&nbsp;33<br />&nbsp;2013-04-26&nbsp;15:09:33&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;115 millseconds<br />&nbsp;2013-04-26&nbsp;15:09:39&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;lid&nbsp;:&nbsp;8701<br />&nbsp;2013-04-26&nbsp;15:09:39&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;8701:&nbsp;33<br />&nbsp;2013-04-26&nbsp;15:09:39&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;50&nbsp;millseconds<br />&nbsp;2013-04-26&nbsp;15:09:42&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;lid&nbsp;:&nbsp;8701<br />&nbsp;2013-04-26&nbsp;15:09:42&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;8701:&nbsp;33<br />&nbsp;2013-04-26&nbsp;15:09:42&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;52&nbsp;millseconds<br />&nbsp;2013-04-26&nbsp;15:09:43&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;lid&nbsp;:&nbsp;8701<br />&nbsp;2013-04-26&nbsp;15:09:43&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;8701:&nbsp;33<br />&nbsp;2013-04-26&nbsp;15:09:43&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;57&nbsp;millseconds<br />&nbsp;&nbsp;2013-04-26&nbsp;15:10:21&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;lid&nbsp;:&nbsp;10000<br />&nbsp;2013-04-26&nbsp;15:10:21&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;10000:&nbsp;-1<br />&nbsp;2013-04-26&nbsp;15:10:21&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;78 millseconds</div><br />多次从memcache取值的代码<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取豆单的历史播发总数<br />&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;lid<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;豆单ID<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;个数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;getPlaylistPlaytimsByLid(<span style="color: #0000FF; ">int</span>&nbsp;lid)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;cacheResult&nbsp;=&nbsp;ptsMemcacheClient.get(PLAYLIST_PTS_KEY_PL_HIS_PT&nbsp;+&nbsp;lid);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;PLAYLIST_PTS_KEY_PL_HIS_PT&nbsp;+&nbsp;lid;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cacheResult&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Integer.parseInt((String)&nbsp;cacheResult);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取豆单列表的历史播发总数<br />&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;lids<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;豆单ID列表<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;个数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Map&lt;Integer,&nbsp;Integer&gt;&nbsp;getPlaylistPlaytimsByLids(List&lt;Integer&gt;&nbsp;lids)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(CollectionUtils.isEmpty(lids))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Collections.EMPTY_MAP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;Integer,&nbsp;Integer&gt;&nbsp;resultMap&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;Integer,&nbsp;Integer&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Integer&nbsp;lid&nbsp;:&nbsp;lids)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultMap.put(lid,&nbsp;getPlaylistPlaytimsByLid(lid));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;resultMap;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div>性能<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->2013-04-26&nbsp;15:13:03&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;lid&nbsp;:&nbsp;10000<br />&nbsp;2013-04-26&nbsp;15:13:03&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;10000:&nbsp;-1<br />&nbsp;2013-04-26&nbsp;15:13:17&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;14206&nbsp;millseconds<br />&nbsp;2013-04-26&nbsp;15:13:27&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;lid&nbsp;:&nbsp;8700<br />&nbsp;2013-04-26&nbsp;15:13:27&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;8700:&nbsp;33<br />2013-04-26&nbsp;15:13:41&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;13703&nbsp;millseconds<br />&nbsp;2013-04-26&nbsp;15:14:25&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;lid&nbsp;:&nbsp;99<br />&nbsp;2013-04-26&nbsp;15:14:25&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;99:&nbsp;-1<br />&nbsp;2013-04-26&nbsp;15:14:38&nbsp;[com.tudou.programs.action.TestAction]-[INFO]&nbsp;13457&nbsp;millseconds</div><br />结论，一次取多值的性能要高于多次取值。<img src ="http://www.blogjava.net/czihong/aggbug/398444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-04-26 15:42 <a href="http://www.blogjava.net/czihong/articles/398444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Pool resources using Apache's Commons Pool Framework</title><link>http://www.blogjava.net/czihong/articles/398040.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Thu, 18 Apr 2013 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398040.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398040.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398040.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Refer to:&nbsp;http://www.javaworld.com/javaworld/jw-01-2005/jw-0124-pool.html?page=1Resource usage could prove critical at times for heavy-duty applications. Some famous Websites have shut down becau...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/398040.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/398040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-04-18 17:03 <a href="http://www.blogjava.net/czihong/articles/398040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SEVERE: Error listenerStart</title><link>http://www.blogjava.net/czihong/articles/396921.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sun, 24 Mar 2013 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/396921.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/396921.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/396921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/396921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/396921.html</trackback:ping><description><![CDATA[<h3>SEVERE: Error listenerStart</h3><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #444444; font-family: Arial, Verdana, sans-serif; line-height: 18px;">Occurs when an exception is thrown in the contextInitialized method of a ServletContextListener</p><h3>SEVERE: Error filterStart</h3><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #444444; font-family: Arial, Verdana, sans-serif; line-height: 18px;">Occurs when an exception is thrown in the init method of a Filter</p><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #444444; font-family: Arial, Verdana, sans-serif; line-height: 18px;">Unfortunately by default, tomcat won't provide you with any details about the cause of the error.&nbsp;Infact it wont even tell you which filter or listener is failing. This can be big problem in applications of significant size that have many filters and listeners configured. Fortunately there is a solution. In your webapplication's WEB-INF/classes folder you can create a logging.properties file with the following contents</p><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #444444; font-family: Arial, Verdana, sans-serif; line-height: 18px;"><code>org.apache.catalina.core.ContainerBase.[Catalina].level = INFO<br />org.apache.catalina.core.ContainerBase.[Catalina].handlers = java.util.logging.ConsoleHandler</code></p><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #444444; font-family: Arial, Verdana, sans-serif; line-height: 18px;">Now you will be presented with the stacktrace</p><img src ="http://www.blogjava.net/czihong/aggbug/396921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-03-24 14:10 <a href="http://www.blogjava.net/czihong/articles/396921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Avoiding the "javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated" with HttpClient</title><link>http://www.blogjava.net/czihong/articles/395627.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 23 Feb 2013 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/395627.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/395627.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/395627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/395627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/395627.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: When developing a https application, your test server often doesn't have a (valid) SSL certificate. This will cause the following exception to be thrown when connecting your client to the test server:...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/395627.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/395627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-02-23 11:50 <a href="http://www.blogjava.net/czihong/articles/395627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java by value or by reference</title><link>http://www.blogjava.net/czihong/articles/395012.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 01 Feb 2013 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/395012.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/395012.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/395012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/395012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/395012.html</trackback:ping><description><![CDATA[<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">Refer to:&nbsp;</span>http://www.blogjava.net/qujinlong123/archive/2007/04/16/111060.html<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;"><br /></span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;"><br />先给出两个例子引出今天所要讨论的问题：</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 1004.5px;"><span style="line-height: 15px; color: #008080;">&nbsp;1</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">&nbsp;2</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">public</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">class</span><span style="line-height: 15px;">&nbsp;Person<br /></span><span style="line-height: 15px; color: #008080;">&nbsp;3</span>&nbsp;<span style="line-height: 15px;">{<br /></span><span style="line-height: 15px; color: #008080;">&nbsp;4</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">private</span><span style="line-height: 15px;">&nbsp;String&nbsp;name&nbsp;</span><span style="line-height: 15px;">=</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">null</span><span style="line-height: 15px;">;<br /></span><span style="line-height: 15px; color: #008080;">&nbsp;5</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">private</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">int</span><span style="line-height: 15px;">&nbsp;age&nbsp;</span><span style="line-height: 15px;">=</span>&nbsp;<span style="line-height: 15px;">0</span><span style="line-height: 15px;">;<br /></span><span style="line-height: 15px; color: #008080;">&nbsp;6</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">&nbsp;7</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">public</span><span style="line-height: 15px;">&nbsp;Person(String&nbsp;name,&nbsp;</span><span style="line-height: 15px; color: #0000ff;">int</span><span style="line-height: 15px;">&nbsp;age)&nbsp;{<br /></span><span style="line-height: 15px; color: #008080;">&nbsp;8</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">this</span><span style="line-height: 15px;">.name&nbsp;</span><span style="line-height: 15px;">=</span><span style="line-height: 15px;">&nbsp;name;<br /></span><span style="line-height: 15px; color: #008080;">&nbsp;9</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">this</span><span style="line-height: 15px;">.age&nbsp;</span><span style="line-height: 15px;">=</span><span style="line-height: 15px;">&nbsp;age;<br /></span><span style="line-height: 15px; color: #008080;">10</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;}<br /></span><span style="line-height: 15px; color: #008080;">11</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">12</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">public</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">void</span><span style="line-height: 15px;">&nbsp;changeName(String&nbsp;newName)&nbsp;{<br /></span><span style="line-height: 15px; color: #008080;">13</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">this</span><span style="line-height: 15px;">.name&nbsp;</span><span style="line-height: 15px;">=</span><span style="line-height: 15px;">&nbsp;newName;<br /></span><span style="line-height: 15px; color: #008080;">14</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;}<br /></span><span style="line-height: 15px; color: #008080;">15</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">16</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">public</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">void</span><span style="line-height: 15px;">&nbsp;changeAge(</span><span style="line-height: 15px; color: #0000ff;">int</span><span style="line-height: 15px;">&nbsp;newAge)&nbsp;{<br /></span><span style="line-height: 15px; color: #008080;">17</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">this</span><span style="line-height: 15px;">.age&nbsp;</span><span style="line-height: 15px;">=</span><span style="line-height: 15px;">&nbsp;newAge;<br /></span><span style="line-height: 15px; color: #008080;">18</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;}<br /></span><span style="line-height: 15px; color: #008080;">19</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">20</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">public</span><span style="line-height: 15px;">&nbsp;String&nbsp;toString()&nbsp;{<br /></span><span style="line-height: 15px; color: #008080;">21</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">return</span>&nbsp;<span style="line-height: 15px;">"</span><span style="line-height: 15px;">Person&nbsp;-&nbsp;Name:&nbsp;</span><span style="line-height: 15px;">"</span>&nbsp;<span style="line-height: 15px;">+</span><span style="line-height: 15px;">&nbsp;name&nbsp;</span><span style="line-height: 15px;">+</span>&nbsp;<span style="line-height: 15px;">"</span><span style="line-height: 15px;">,&nbsp;Age:&nbsp;</span><span style="line-height: 15px;">"</span>&nbsp;<span style="line-height: 15px;">+</span><span style="line-height: 15px;">&nbsp;age;<br /></span><span style="line-height: 15px; color: #008080;">22</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;}<br /></span><span style="line-height: 15px; color: #008080;">23</span>&nbsp;<span style="line-height: 15px;">}<br /></span><span style="line-height: 15px; color: #008080;">24</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">25</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">public</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">class</span><span style="line-height: 15px;">&nbsp;PassByValue<br /></span><span style="line-height: 15px; color: #008080;">26</span>&nbsp;<span style="line-height: 15px;">{<br /></span><span style="line-height: 15px; color: #008080;">27</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">public</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">static</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">void</span><span style="line-height: 15px;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br /></span><span style="line-height: 15px; color: #008080;">28</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 15px; color: #008000;">//</span><span style="line-height: 15px; color: #008000;">&nbsp;one&nbsp;example</span><span style="line-height: 15px; color: #008000;"><br /></span><span style="line-height: 15px; color: #008080;">29</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value1&nbsp;</span><span style="line-height: 15px;">=</span>&nbsp;<span style="line-height: 15px;">"</span><span style="line-height: 15px;">value1:&nbsp;aaa</span><span style="line-height: 15px;">"</span><span style="line-height: 15px;">;<br /></span><span style="line-height: 15px; color: #008080;">30</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value2&nbsp;</span><span style="line-height: 15px;">=</span>&nbsp;<span style="line-height: 15px;">"</span><span style="line-height: 15px;">value2:&nbsp;bbb</span><span style="line-height: 15px;">"</span><span style="line-height: 15px;">;<br /></span><span style="line-height: 15px; color: #008080;">31</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">32</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;swapValue(value1,&nbsp;value2);<br /></span><span style="line-height: 15px; color: #008080;">33</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">34</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(value1);<br /></span><span style="line-height: 15px; color: #008080;">35</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(value2);<br /></span><span style="line-height: 15px; color: #008080;">36</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">37</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="line-height: 15px; color: #008000;">//</span><span style="line-height: 15px; color: #008000;">&nbsp;another&nbsp;example</span><span style="line-height: 15px; color: #008000;"><br /></span><span style="line-height: 15px; color: #008080;">38</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person&nbsp;</span><span style="line-height: 15px;">=</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">new</span><span style="line-height: 15px;">&nbsp;Person(</span><span style="line-height: 15px;">"</span><span style="line-height: 15px;">张三</span><span style="line-height: 15px;">"</span><span style="line-height: 15px;">,&nbsp;</span><span style="line-height: 15px;">20</span><span style="line-height: 15px;">);<br /></span><span style="line-height: 15px; color: #008080;">39</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">40</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(person.toString());<br /></span><span style="line-height: 15px; color: #008080;">41</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">42</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;changePerson(person);<br /></span><span style="line-height: 15px; color: #008080;">43</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">44</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(person.toString());<br /></span><span style="line-height: 15px; color: #008080;">45</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;}<br /></span><span style="line-height: 15px; color: #008080;">46</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">47</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">public</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">static</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">void</span><span style="line-height: 15px;">&nbsp;swapValue(String&nbsp;tmpValue1,&nbsp;String&nbsp;tmpValue2)&nbsp;{<br /></span><span style="line-height: 15px; color: #008080;">48</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tempStr&nbsp;</span><span style="line-height: 15px;">=</span><span style="line-height: 15px;">&nbsp;tmpValue1;<br /></span><span style="line-height: 15px; color: #008080;">49</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;tmpValue1&nbsp;</span><span style="line-height: 15px;">=</span><span style="line-height: 15px;">&nbsp;tmpValue2;<br /></span><span style="line-height: 15px; color: #008080;">50</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;tmpValue2&nbsp;</span><span style="line-height: 15px;">=</span><span style="line-height: 15px;">&nbsp;tempStr;<br /></span><span style="line-height: 15px; color: #008080;">51</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;}<br /></span><span style="line-height: 15px; color: #008080;">52</span>&nbsp;<span style="line-height: 15px;"><br /></span><span style="line-height: 15px; color: #008080;">53</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;</span><span style="line-height: 15px; color: #0000ff;">public</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">static</span>&nbsp;<span style="line-height: 15px; color: #0000ff;">void</span><span style="line-height: 15px;">&nbsp;changePerson(Person&nbsp;tmpPerson)&nbsp;{<br /></span><span style="line-height: 15px; color: #008080;">54</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;tmpPerson.changeName(</span><span style="line-height: 15px;">"</span><span style="line-height: 15px;">李四</span><span style="line-height: 15px;">"</span><span style="line-height: 15px;">);<br /></span><span style="line-height: 15px; color: #008080;">55</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;tmpPerson.changeAge(</span><span style="line-height: 15px;">30</span><span style="line-height: 15px;">);<br /></span><span style="line-height: 15px; color: #008080;">56</span>&nbsp;<span style="line-height: 15px;">&nbsp;&nbsp;}<br /></span><span style="line-height: 15px; color: #008080;">57</span>&nbsp;<span style="line-height: 15px;">}<br /></span><span style="line-height: 15px; color: #008080;">58</span>&nbsp;</div><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">考虑一下上面这段代码的输出结果是什么？</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">我相信绝大多数人都能快速的给出正确答案：</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">value1: aaa</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">value2: bbb</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">Person - Name: 张三, Age: 20</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">Person - Name: 李四, Age: 30</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">答案为什么是这样的呢？那么 Java 到底是按值传递还是按引用传递参数的呢？</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">例子1中的 swapValue() 方法不起作用，看起来是按值传递参数的，例子2中的 changeName() 和 changeAge() 方法起作用，从表面上看起来好像又是按引用传递参数的。呵呵，别急，先让我们来弄清楚一个重要的概念，就是 Java 操纵对象都是通过引用来实现的，所有的对象变量都是所指向的对象的引用，那也就是说所有对象变量的值并不是它所指向的对象本身，而是该对象的引用，这句话听起来可能有点让人犯晕，举个例子来说，String str = new String("aaa"); 这条语句的意思是 new 了一个值为 "aaa" 的字符串对象，然后用一个名字叫 str 的对象变量来指向它，保存它的引用，假设在内存中 new 出来的这个字符串对象的实际地址为 0xA242, 那么 str 的值实际上是 0xA242。</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">现在来看看例子1，假设&nbsp;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">String value1 = "value1: aaa" 的地址为 0xA242，</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">String value2 = "value2: bbb" 的地址为 0xA24B,&nbsp;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">然我们来看看 swapValue(value1, value2); 语句 Java 是怎么执行的。当程序执行到这句语句的时候，JVM 在栈中创建两个临时变量 tmpValue1,tmpValue2，用来接收传进来的 value1 和 value2 的值，而 value1 和 value2 的值分别为 0xA242 和 0xA24B，所以那两个临时变量 tmpValue1和tmpValue2 的值也被赋值为 0xA242 和 0xA24B，此时接下来的三条语句分别是&nbsp;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">tempStr = 0xA242,&nbsp;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">tmpValue1 = 0xA24B,&nbsp;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">tmpValue2 = 0xA242;&nbsp;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">此时 tmpValue1 的值是指向 "value2: bbb" 这个对象的，</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">　　 tmpValue2 的值是指向 "value1: aaa" 这个对象，你可以在 swapValue() 方法内部打印 tmpValue1 和 tmpValue2 的值验证一下。</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">不过这里的 tmpValue1和tmpValue2 是在栈中的临时变量，而并不是 main 方法中 value1和value2，main 方法中 value1和value2 的值并没有改变，那这里所谓的值传递是指什么呢？因为 value1 的值是 0xA242（"value1: aaa" 这个对象的引用），而并不是 "value1: aaa" 这个对象，传递参数时传递的是 "value1: aaa" 这个对象的引用也就是 value1 的值，所以是值传递。</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">例子2也是一样的，假设</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">Person person = new Person("张三", 20) 的地址为 0xA242，</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff;">那么 person 的值是 0xA242, 那么通过调用 changePerson(person); 将 0xA242 传递给 tmpPerson, 也就是 tmpPerson 此时的值为 0xA242 也就是 new Person("张三", 20) 这个对象的引用，也就是说 tmpPerson 指向 new Person("张三", 20) 对象，对 tmpPerson 引用对象的修改实际上就是对 person 引用对象的修改，这看起来很想引用传递的概念，但实际上是值传递，为什么呢？因为在参数传递过程中传递的是 person 的值，也就是 0xA242。</span><img src ="http://www.blogjava.net/czihong/aggbug/395012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-02-01 11:20 <a href="http://www.blogjava.net/czihong/articles/395012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Log4j</title><link>http://www.blogjava.net/czihong/articles/394015.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Wed, 09 Jan 2013 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/394015.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/394015.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/394015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/394015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/394015.html</trackback:ping><description><![CDATA[<strong>1、 Log4j是什么？<br /></strong>&nbsp; Log4j可以帮助调试（有时候debug是发挥不了作 用的）和分析，要下载和了解更详细的内容，还是访问其官方网站吧：&nbsp;<a href="http://jakarta.apache.org/log4j" style="color: #6fbc4c; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13.333333969116211px;">http://jakarta.apache.org/log4j&nbsp;</a>。<br /><br /><strong>2、Log4j的概念</strong><br />&nbsp;&nbsp;&nbsp;Log4j中有三个主要的组件，它们分别是&nbsp;Logger、Appender和Layout，Log4j 允许开发人员定义多个Logger，每个Logger拥有自己的名字，Logger之间通过名字来表明隶属关系。有一个Logger称为Root，它永远 存在，且不能通过名字检索或引用，可以通过Logger.getRootLogger()方法获得，其它Logger通过 Logger.getLogger(String name)方法。<br />&nbsp;&nbsp; Appender则是用来指明将所有的log信息存放到什么地方，Log4j中支持多种appender，如&nbsp;console、files、GUI components、NT Event Loggers等，一个Logger可以拥有多个Appender，也就是你既可以将Log信息输出到屏幕，同时存储到一个文件中。<br />&nbsp;&nbsp; Layout的作用是控制Log信息的输出方式，也就是格式化输出的信息。<br />&nbsp;&nbsp; Log4j中将要输出的Log信息定义了5种级别，依次为DEBUG、INFO、WARN、ERROR和FATAL，当输出时，只有级别高过配置中规定的 级别的信息才能真正的输出，这样就很方便的来配置不同情况下要输出的内容，而不需要更改代码，这点实在是方便啊。<br /><br /><strong>3、Log4j的配置文件</strong><br />&nbsp; 虽然可以不用配置文件，而在程序中实现配置，但这种方法在如今的系统开发中显然是不可取的，能采用配置文件的地方一定一定要用配置文件。Log4j支持两 种格式的配置文件：XML格式和Java的property格式，本人更喜欢后者，首先看一个简单的例子吧，如下：<br /><br />&nbsp; log4j.rootLogger=debug,&nbsp;<strong>stdout, R</strong><br />&nbsp; log4j.appender.<strong>stdout</strong>=org.apache.log4j.ConsoleAppender<br />&nbsp; log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br /><br />&nbsp; # Pattern to output the caller's file name and line number.<br />&nbsp; log4j.appender.stdout.layout.ConversionPattern=%5p [%t]&nbsp;<strong>(%F:%L)</strong>&nbsp;- %m%n<br /><br />&nbsp; log4j.appender.<strong>R</strong>=org.apache.log4j.RollingFileAppender<br />&nbsp; log4j.appender.R.File=example.log<br />&nbsp; log4j.appender.R.MaxFileSize=&nbsp;<strong>100KB<br /></strong><br />&nbsp; # Keep one backup file<br />&nbsp; log4j.appender.R.MaxBackupIndex=1<br /><br />&nbsp; log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />&nbsp; log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp; 首先，是设置root，格式为&nbsp;log4j.rootLogger=[level],appenderName,&nbsp;...，其中level就是设置需要输出信息的级别，后面是appender的输出的目的地，appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。&nbsp;配置日志信息输出目的地Appender，其语法为<br />&nbsp; log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />&nbsp; log4j.appender.appenderName.option1 = value1<br />&nbsp; ...<br />&nbsp; log4j.appender.appenderName.option = valueN&nbsp;<br />Log4j提供的appender有以下几种：<br />&nbsp; org.apache.log4j.ConsoleAppender（控制台）<br />&nbsp; org.apache.log4j.FileAppender（文件）<br />&nbsp; org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />&nbsp; org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生新文件）<br />&nbsp; org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />配置日志信息的格式（布局），其语法为：<br />&nbsp; log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />&nbsp; log4j.appender.appenderName.layout.option1 = value1<br />&nbsp; ....<br />&nbsp; log4j.appender.appenderName.layout.option = valueN&nbsp;<br />Log4j提供的layout有以下几种：<br />&nbsp; org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />&nbsp; org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />&nbsp; org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />&nbsp; org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）&nbsp;<br /><br /><span style="font-size: 10.5pt;">Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下： %m 输出代码中指定的消息</span><p style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13.333333969116211px;"><span style="font-size: 10.5pt;">　　&nbsp;%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL&nbsp;<br />　　%r 输出自应用启动到输出该log信息耗费的毫秒数&nbsp;<br />　　%c 输出所属的类目，通常就是所在类的全名&nbsp;<br />　　%t 输出产生该日志事件的线程名&nbsp;<br />　　%n 输出一个回车换行符，Windows平台为&#8220;\r\n&#8221;，Unix平台为&#8220;\n&#8221;&nbsp;<br />　　%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：&nbsp;</span><span style="font-size: 10.5pt;">2002年10月18日&nbsp;</span><span style="font-size: 10.5pt;">22：10：28，921&nbsp;<br />　　%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10)</span></p><br style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13.333333969116211px;" /><br /><strong>4、Log4j在程序中的使用</strong>&nbsp;<br />&nbsp; 要在自己的程序中使用Log4j，首先需要将commons-logging.jar和logging-log4j-1.2.9.jar导入到构建路径中。然后再将log4j.properties放到src根目录下。这样就可以在程序中使用log4j了。在类中使用log4j，&nbsp;首先声明一个静态变量&nbsp;Logger logger=Logger.getLog("classname")；现在就可以使用了，用法如下：logger.debug("debug message")或者logger.info("info message")，看下面一个小例子：&nbsp;<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp;&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;com.foo.Bar;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.apache.log4j.Logger;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.apache.log4j.PropertyConfigurator;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyApp&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;Logger.getLogger(MyApp.<span style="color: #0000FF; ">class</span>.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;BasicConfigurator&nbsp;replaced&nbsp;with&nbsp;PropertyConfigurator.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyConfigurator.configure(args[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info("Entering&nbsp;application.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bar&nbsp;bar&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Bar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bar.doIt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info("Exiting&nbsp;application.");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}</div><img src ="http://www.blogjava.net/czihong/aggbug/394015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-01-09 14:39 <a href="http://www.blogjava.net/czihong/articles/394015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP</title><link>http://www.blogjava.net/czihong/articles/393531.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Thu, 27 Dec 2012 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/393531.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/393531.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/393531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/393531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/393531.html</trackback:ping><description><![CDATA[<span style="font-family: Tahoma; font-size: 12px; line-height: 18px;">Spring AOP 简单理解</span><br style="font-family: Tahoma; font-size: 12px; line-height: 18px;" /><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">AOP技术即（面向切面编程）技术是在面向对象编程基础上的发展，AOP技术是对所有对象或一类对象编程。核心是在不增加代码的基础上，还增加了新的功能。AOP编程在开发框架本身用的比较多，而实际项目中，用的比较少。它是将分散在各个业务逻辑代码中的相同代码抽取出来形成一个独立的模块。</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">1、定义AOP术语</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（1）切面（aspect）：要实现的交叉功能，是系统模块化的一个切面或领域。</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（2）通知（advice）：切面的具体实现，包含五类通知。</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（3）连接点（jointpoint）：应用程序执行过程中插入切面的地点。</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（4）切点（cutpoint）：定义通知应该应用哪些连接点。</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（5）引入（introduction）：为类添加新方法和属性。</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（6）目标对象（target）：通知逻辑的织入目标类。</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（7）代理（proxy）：将通知应用到目标对象后创建的对象，应用系统的其他部分不用为了支持代理对象而改变</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（8）织入（weaving）：将切面应用到目标对象从而创建一个新代理对象的过程。</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">2、AOP原理和实例</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（1）基础接口和类的实现：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">package</span>&nbsp;com.jasson.aop;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;TestServiceInter1&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHello();<br />}<br /><br /><br /><span style="color: #0000FF; ">package</span>&nbsp;com.jasson.aop;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;TestServiceInter2&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayBye();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHi();<br />}</div></p><pre name="code" style="font-size: 12px; line-height: 18px;"><span style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（2）实现类如下：</span></pre><pre name="code" style="font-size: 12px; line-height: 18px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">package</span>&nbsp;com.jasson.aop;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TestService&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;TestServiceInter1,TestServiceInter2&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHello()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sayHello()&nbsp;method&nbsp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayBye()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sayBye()&nbsp;method");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHi()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sayHi()&nbsp;method");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></pre><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（1）前置通知：要求在每个方法调用前进行日志记录，则用的前置通知，定义如下：</p><pre name="code" style="font-size: 12px; line-height: 18px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">package</span>&nbsp;com.jasson.aop;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.reflect.Method;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.aop.MethodBeforeAdvice;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyMethodBeforeAdvice&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;MethodBeforeAdvice&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;method:&nbsp;方法名<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;args:&nbsp;输入参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;target:&nbsp;目标对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;before(Method&nbsp;method,&nbsp;Object[]&nbsp;args,&nbsp;Object&nbsp;target)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Throwable&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />"+method.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></pre><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">配置文件如下：</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;<br />&lt;beans&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context="http://www.springframework.org/schema/context"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx="http://www.springframework.org/schema/tx"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/context&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/context/spring-context-2.5.xsd</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/tx&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/tx/spring-tx-2.5.xsd</span><span style="color: #008000; ">"&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&lt;!--&nbsp;配置被代理的对象,即目标对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="testService"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.TestService"&nbsp;/&gt;<br />&lt;!--&nbsp;配置前置通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myMethodBeforeAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyMethodBeforeAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置代理对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="proxyFactoryBean"&nbsp;<span style="color: #0000FF; ">class</span>="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;代理接口集&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="proxyInterfaces"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter1&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter2&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;把通知织入到代理对象&nbsp;&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="interceptorNames"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;相当于包MyMethodBeforeAdvice前置通知和代理对象关联,我们也<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以把通知看出拦截器,struts2核心拦截器&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myMethodBeforeAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;配置被代理对象,即目标对象&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="target"&nbsp;ref="testService"/&gt;<br />&lt;/bean&gt;<br />&lt;/beans&gt;<br />&nbsp;<br /><br /><span style="color: #0000FF; ">package</span>&nbsp;com.jasson.aop;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationContext;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;App1&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;args<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ac=<span style="color: #0000FF; ">new</span>&nbsp;ClassPathXmlApplicationContext("com/jasson/aop/beans.xml");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestServiceInter1&nbsp;ts=(TestServiceInter1)&nbsp;ac.getBean("proxyFactoryBean");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ts.sayHello();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("*******************************************");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((TestServiceInter2)ts).sayBye();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("*******************************************");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((TestServiceInter2)ts).sayHi();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></div><pre name="code" style="font-size: 12px; line-height: 18px;"><span style="background-color: #eeeeee; font-size: 13px;">}</span><span style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;</span></pre><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;执行结果如下：</p><pre name="code" style="font-size: 12px; line-height: 18px;"><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->31-May-2012&nbsp;18:19:53&nbsp;org.springframework.beans.factory.support.DefaultListableBeanFactory&nbsp;preInstantiateSingletons<br />INFO:&nbsp;Pre-instantiating&nbsp;singletons&nbsp;in&nbsp;org.springframework.beans.factory.support.DefaultListableBeanFactory@c8f6f8:&nbsp;defining&nbsp;beans&nbsp;[testService,myMethodBeforeAdvice,<br />myAfterReturningAdvice,myMethodInterceptor,myThrowsAdvice,proxyFactoryBean];&nbsp;root&nbsp;of&nbsp;factory&nbsp;hierarchy<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHello<br />sayHello()&nbsp;method&nbsp;<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayBye<br />sayBye()&nbsp;method<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHi<br />sayHi()&nbsp;method</div></pre><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（2）后置通知：要求在调用每个方法后执行的功能，例如在调用每个方法后关闭资源</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">package</span>&nbsp;com.jasson.aop;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.reflect.Method;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.aop.AfterReturningAdvice;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyAfterReturningAdvice&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;AfterReturningAdvice&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;afterReturning(Object&nbsp;returnValue,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;arg,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;target)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Throwable&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("后置通知调用，关闭资源<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />"+method.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><pre name="code" style="font-size: 12px; line-height: 18px;"><span style="background-color: #eeeeee; font-size: 13px;">}<br /></span><span style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;bean 配置如下：</span></pre><pre name="code" style="font-size: 12px; line-height: 18px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;<br />&lt;beans&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context="http://www.springframework.org/schema/context"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx="http://www.springframework.org/schema/tx"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/context&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/context/spring-context-2.5.xsd</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/tx&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/tx/spring-tx-2.5.xsd</span><span style="color: #008000; ">"&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&lt;!--&nbsp;配置被代理的对象,即目标对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="testService"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.TestService"&nbsp;/&gt;<br />&lt;!--&nbsp;配置前置通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myMethodBeforeAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyMethodBeforeAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置后置通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myAfterReturningAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyAfterReturningAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置代理对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="proxyFactoryBean"&nbsp;<span style="color: #0000FF; ">class</span>="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;代理接口集&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="proxyInterfaces"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter1&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter2&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;把通知织入到代理对象&nbsp;&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="interceptorNames"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;相当于包MyMethodBeforeAdvice前置通知和代理对象关联,我们也<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以把通知看出拦截器,struts2核心拦截器&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myMethodBeforeAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myAfterReturningAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;配置被代理对象,即目标对象&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="target"&nbsp;ref="testService"/&gt;<br />&lt;/bean&gt;<br />&lt;/beans&gt;</div></pre><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">执行结果如下：</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->INFO:&nbsp;Pre-instantiating&nbsp;singletons&nbsp;in&nbsp;org.springframework.beans.factory.support.DefaultListableBeanFactory@122cdb6:&nbsp;defining&nbsp;beans&nbsp;[testService,myMethodBeforeAdvice,myAfterReturningAdvice,myMethodInterceptor,myThrowsAdvice,proxyFactoryBean];&nbsp;root&nbsp;of&nbsp;factory&nbsp;hierarchy<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHello<br />sayHello()&nbsp;method&nbsp;<br />后置通知调用，关闭资源<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHello<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayBye<br />sayBye()&nbsp;method<br />后置通知调用，关闭资源<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayBye<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHi<br />sayHi()&nbsp;method</div><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;"><span style="background-color: #eeeeee; font-size: 13px;">后置通知调用，关闭资源</span><img src="http://www.blogjava.net/Images/dot.gif" style="font-size: 13px;"  alt="" /><span style="background-color: #eeeeee; font-size: 13px;">sayHi</span><span style="font-size: 12px; line-height: 18px;">&nbsp;</span></p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（3）环绕通知：指在某个具体的方法中，添加相应的操作</p><pre name="code" style="font-size: 12px; line-height: 18px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">package</span>&nbsp;com.jasson.aop;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.aopalliance.intercept.MethodInterceptor;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.aopalliance.intercept.MethodInvocation;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyMethodInterceptor&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;MethodInterceptor&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;invoke(MethodInvocation&nbsp;arg)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Throwable&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("环绕通知调用方法前");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj&nbsp;=&nbsp;arg.proceed();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("环绕通知调用方法后");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></pre><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">配置文件如下：</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;<br />&lt;beans&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context="http://www.springframework.org/schema/context"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx="http://www.springframework.org/schema/tx"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/context&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/context/spring-context-2.5.xsd</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/tx&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/tx/spring-tx-2.5.xsd</span><span style="color: #008000; ">"&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&lt;!--&nbsp;配置被代理的对象,即目标对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="testService"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.TestService"&nbsp;/&gt;<br />&lt;!--&nbsp;配置前置通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myMethodBeforeAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyMethodBeforeAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置后置通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myAfterReturningAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyAfterReturningAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置环绕通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myMethodInterceptor"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyMethodInterceptor"&nbsp;/&gt;<br />&lt;!--&nbsp;配置代理对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="proxyFactoryBean"&nbsp;<span style="color: #0000FF; ">class</span>="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;代理接口集&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="proxyInterfaces"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter1&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter2&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;把通知织入到代理对象&nbsp;&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="interceptorNames"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;相当于包MyMethodBeforeAdvice前置通知和代理对象关联,我们也<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以把通知看出拦截器,struts2核心拦截器&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myMethodBeforeAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myAfterReturningAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myMethodInterceptor&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;配置被代理对象,即目标对象&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="target"&nbsp;ref="testService"/&gt;<br />&lt;/bean&gt;</div><pre name="code" style="font-size: 12px; line-height: 18px;"><span style="background-color: #eeeeee; font-size: 13px;">&lt;/</span><span style="background-color: #eeeeee; font-size: 13px;">beans</span><span style="background-color: #eeeeee; font-size: 13px;">&gt;<br /></span><span style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;执行结果如下：</span></pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->INFO:&nbsp;Pre-instantiating&nbsp;singletons&nbsp;in&nbsp;org.springframework.beans.factory.support.DefaultListableBeanFactory@1ce2dd4:&nbsp;defining&nbsp;beans&nbsp;[testService,myMethodBeforeAdvice,myAfterReturningAdvice,myMethodInterceptor,proxyFactoryBean];&nbsp;root&nbsp;of&nbsp;factory&nbsp;hierarchy<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHello<br />环绕通知调用方法前<br />sayHello()&nbsp;method&nbsp;<br />环绕通知调用方法后<br />后置通知调用，关闭资源<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHello<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayBye<br />环绕通知调用方法前<br />sayBye()&nbsp;method<br />环绕通知调用方法后<br />后置通知调用，关闭资源<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayBye<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHi<br />环绕通知调用方法前<br />sayHi()&nbsp;method<br />环绕通知调用方法后</div><pre name="code" style="font-size: 12px; line-height: 18px;"><span style="background-color: #eeeeee; font-size: 13px;">后置通知调用，关闭资源</span><img src="http://www.blogjava.net/Images/dot.gif" style="font-size: 13px;"  alt="" /><span style="background-color: #eeeeee; font-size: 13px;">sayHi<br /></span><span style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;（4）异常通知：当发生异常时，要执行的通知</span></pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">package</span>&nbsp;com.jasson.aop;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.reflect.Method;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.aop.ThrowsAdvice;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyThrowsAdvice&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;ThrowsAdvice&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;afterThrowing(Method&nbsp;method,&nbsp;Object[]&nbsp;os,&nbsp;Object&nbsp;target,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exception&nbsp;exception)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("异常通知产生异常，进行处理"&nbsp;+&nbsp;exception.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><br />&nbsp;<br /><br />&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;<br />&lt;beans&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context="http://www.springframework.org/schema/context"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx="http://www.springframework.org/schema/tx"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/context&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/context/spring-context-2.5.xsd</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/tx&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/tx/spring-tx-2.5.xsd</span><span style="color: #008000; ">"&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&lt;!--&nbsp;配置被代理的对象,即目标对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="testService"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.TestService"&nbsp;/&gt;<br />&lt;!--&nbsp;配置前置通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myMethodBeforeAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyMethodBeforeAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置后置通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myAfterReturningAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyAfterReturningAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置环绕通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myMethodInterceptor"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyMethodInterceptor"&nbsp;/&gt;<br />&lt;!--&nbsp;配置异常通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myThrowsAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyThrowsAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置代理对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="proxyFactoryBean"&nbsp;<span style="color: #0000FF; ">class</span>="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;代理接口集&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="proxyInterfaces"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter1&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter2&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;把通知织入到代理对象&nbsp;&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="interceptorNames"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;相当于包MyMethodBeforeAdvice前置通知和代理对象关联,我们也<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以把通知看出拦截器,struts2核心拦截器&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myMethodBeforeAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myAfterReturningAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myMethodInterceptor&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myThrowsAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;配置被代理对象,即目标对象&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="target"&nbsp;ref="testService"/&gt;<br />&lt;/bean&gt;<br />&nbsp;<br /><br /><span style="color: #0000FF; ">package</span>&nbsp;com.jasson.aop;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TestService&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;TestServiceInter1,TestServiceInter2&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHello()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sayHello()&nbsp;method&nbsp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayBye()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sayBye()&nbsp;method");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHi()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=10/0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sayHi()&nbsp;method");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><pre name="code" style="font-size: 12px; line-height: 18px;"><span style="background-color: #eeeeee; font-size: 13px;">&nbsp;<br /></span><span style="font-family: Tahoma; font-size: 12px; line-height: 18px;">执行结果如下：</span></pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->INFO:&nbsp;Pre-instantiating&nbsp;singletons&nbsp;in&nbsp;org.springframework.beans.factory.support.DefaultListableBeanFactory@1ce2dd4:&nbsp;defining&nbsp;beans&nbsp;[testService,myMethodBeforeAdvice,myAfterReturningAdvice,myMethodInterceptor,myThrowsAdvice,proxyFactoryBean];&nbsp;root&nbsp;of&nbsp;factory&nbsp;hierarchy<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHello<br />环绕通知调用方法前<br />sayHello()&nbsp;method&nbsp;<br />环绕通知调用方法后<br />后置通知调用，关闭资源<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHello<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayBye<br />环绕通知调用方法前<br />sayBye()&nbsp;method<br />环绕通知调用方法后<br />后置通知调用，关闭资源<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayBye<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHi<br />环绕通知调用方法前<br />异常通知产生异常，进行处理/&nbsp;by&nbsp;zero</div><pre name="code" style="font-size: 12px; line-height: 18px;"><span style="background-color: #eeeeee; font-size: 13px;">Exception&nbsp;in&nbsp;thread&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px;">"</span><span style="background-color: #eeeeee; font-size: 13px;">main</span><span style="background-color: #eeeeee; font-size: 13px;">"</span><span style="background-color: #eeeeee; font-size: 13px;">&nbsp;java.lang.ArithmeticException:&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px;">/</span><span style="background-color: #eeeeee; font-size: 13px;">&nbsp;by&nbsp;zero</span><span style="font-family: Tahoma; font-size: 12px; line-height: 18px;">&nbsp;</span></pre><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">（5）上面的通知都是针对每个方法的，如果只是对单个或者一类的方法进行相应处理的时，可采用名字或者正则表达式的方式进行处理</p><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">配置如下：</p><pre name="code" style="font-size: 12px; line-height: 18px;"><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;<br />&lt;beans&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context="http://www.springframework.org/schema/context"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx="http://www.springframework.org/schema/tx"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/context&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/context/spring-context-2.5.xsd</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">www.springframework.org/schema/tx&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.springframework.org/schema/tx/spring-tx-2.5.xsd</span><span style="color: #008000; ">"&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&lt;!--&nbsp;配置被代理的对象,即目标对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="testService"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.TestService"&nbsp;/&gt;<br />&lt;!--&nbsp;配置前置通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myMethodBeforeAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyMethodBeforeAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置后置通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myAfterReturningAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyAfterReturningAdvice"&nbsp;/&gt;<br />&lt;!--&nbsp;配置环绕通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myMethodInterceptor"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyMethodInterceptor"&nbsp;/&gt;<br />&lt;!--&nbsp;配置异常通知&nbsp;--&gt;<br />&lt;bean&nbsp;id="myThrowsAdvice"&nbsp;<span style="color: #0000FF; ">class</span>="com.jasson.aop.MyThrowsAdvice"&nbsp;/&gt;<br /><br />&lt;!--&nbsp;通知与正则表达式切入点一起配置&nbsp;--&gt;&nbsp;&nbsp;<br />&lt;!--&nbsp;Advisor等于切入点加通知,所有say开头的方法添加前置通知&nbsp;--&gt;&nbsp;&nbsp;<br />&lt;bean&nbsp;id="regexpPointcutAdvisor"&nbsp;<span style="color: #0000FF; ">class</span>="org.springframework.aop.support.RegexpMethodPointcutAdvisor"&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="advice"&nbsp;ref="myMethodBeforeAdvice"/&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="patterns"&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;.*say.*&lt;/value&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;<br />&lt;/bean&gt;&nbsp;&nbsp;<br /><br />&lt;!--&nbsp;方法名匹配切入点配置器：只对&nbsp;sayHello方法添加环绕通知--&gt;&nbsp;&nbsp;<br />&lt;bean&nbsp;id="namePointcutAdvisor"&nbsp;<span style="color: #0000FF; ">class</span>="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="advice"&nbsp;ref="myMethodInterceptor"/&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="mappedNames"&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;sayHello&lt;/value&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;<br />&lt;/bean&gt;&nbsp;<br /><br />&lt;!--&nbsp;配置代理对象&nbsp;--&gt;<br />&lt;bean&nbsp;id="proxyFactoryBean"&nbsp;<span style="color: #0000FF; ">class</span>="org.springframework.aop.framework.ProxyFactoryBean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;代理接口集&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="proxyInterfaces"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter1&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com.jasson.aop.TestServiceInter2&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;把通知织入到代理对象&nbsp;&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="interceptorNames"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;相当于包MyMethodBeforeAdvice前置通知和代理对象关联,我们也<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以把通知看出拦截器,struts2核心拦截器&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;namePointcutAdvisor&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myAfterReturningAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;regexpPointcutAdvisor&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;myThrowsAdvice&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;配置被代理对象,即目标对象&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="target"&nbsp;ref="testService"/&gt;<br />&lt;/bean&gt;<br />&lt;/beans&gt;</div></pre><p style="font-family: Tahoma; font-size: 12px; line-height: 18px;">执行结果如下：</p><pre name="code" style="font-size: 12px; line-height: 18px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->INFO:&nbsp;Pre-instantiating&nbsp;singletons&nbsp;in&nbsp;org.springframework.beans.factory.support.DefaultListableBeanFactory@1ef9157:&nbsp;defining&nbsp;beans&nbsp;<br />[testService,myMethodBeforeAdvice,myAfterReturningAdvice,myMethodInterceptor,myThrowsAdvice,regexpPointcutAdvisor,namePointcutAdvisor,proxyFactoryBean];&nbsp;<br />root&nbsp;of&nbsp;factory&nbsp;hierarchy<br />环绕通知调用方法前<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHello<br />sayHello()&nbsp;method&nbsp;<br />后置通知调用，关闭资源<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHello<br />环绕通知调用方法后<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayBye<br />sayBye()&nbsp;method<br />后置通知调用，关闭资源<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayBye<br />*******************************************<br />前置通知调用&nbsp;记录日志<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />sayHi<br />异常通知产生异常，进行处理/&nbsp;by&nbsp;zero<br />Exception&nbsp;in&nbsp;thread&nbsp;"main"&nbsp;java.lang.ArithmeticException:&nbsp;/&nbsp;by&nbsp;zero</div></pre><img src ="http://www.blogjava.net/czihong/aggbug/393531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-12-27 11:30 <a href="http://www.blogjava.net/czihong/articles/393531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Understand JPA</title><link>http://www.blogjava.net/czihong/articles/393416.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Mon, 24 Dec 2012 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/393416.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/393416.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/393416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/393416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/393416.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Need three artifacts to implement a JPA-compliant program:     An entity class     A persistence.xml file     A class through which you will insert, update, or find an entityJPA is all abo...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/393416.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/393416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-12-24 17:12 <a href="http://www.blogjava.net/czihong/articles/393416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Understand The SerialVersionUID</title><link>http://www.blogjava.net/czihong/articles/392130.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Wed, 28 Nov 2012 04:01:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/392130.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/392130.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/392130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/392130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/392130.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">Refer To:&nbsp;<span style="font-size: 14px; line-height: 21px;">http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/</span><br /><br />If you have ever implemented&nbsp;<strong>Serializable&nbsp;</strong>interface, you must encounter this warning message</p>
<div style="color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">
<div>
<pre style="padding: 10px; font-size: 13px; color: #333333; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; line-height: 1.5; background-color: #f7f7f9; border: 1px solid #d1d1e8; margin-top: 0px; margin-bottom: 20px; overflow-x: auto;">The serializable class xxx does not <span style="color: #7a0874; font-weight: bold;">declare</span> a static final serialVersionUID field of <span style="color: #7a0874; font-weight: bold;">type</span> long</pre>
</div>
</div>
<h3>So&#8230;what is serialVersionUID?</h3>
<p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">The serialVersionUID is used as a version control in a Serializable class. If you do not explicitly declare a serialVersionUID, JVM will do it for you automatically, based on various aspects of your Serializable class, as described in the&nbsp;<a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html" target="_blank" style="color: #0f3b68;">Java(TM) Object Serialization Specification</a>.</p>
<h4>1. SerialVersionUID Example</h4>
<p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">The above statement is a bit hard to understand at the beginning (at least I did), let start an example to understand how Serializable class use SerialVersionUID to implement version control.<br />
</p>
<h4>1.1 Address.java</h4>
<p style="margin: 0px 0px 20px; font-size: 14px; line-height: 21px;">A serializable class with a serialVersionUID of 1L.<br />
<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.Serializable;<br />
&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;Address&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Serializable{<br />
&nbsp;<br />
&nbsp;&nbsp;&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; ">1L</span><span style="color: #000000; ">;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;street;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;country;<br />
&nbsp;<br />
&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;setStreet(String&nbsp;street){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.street&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;street;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&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;setCountry(String&nbsp;country){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.country&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;getStreet(){<br />
&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; ">.street;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;getCountry(){<br />
&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; ">.country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;toString()&nbsp;{<br />
&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;StringBuffer(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;Street&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.street)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;Country&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.country).toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>&nbsp;</p>
<p></p><h4>1.2 WriteObject.java</h4><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">A simple class to write / serialize the Address object into a file &#8211; &#8220;c:\\address.ser&#8221;.<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.FileOutputStream;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.ObjectOutputStream;<br />&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;WriteObject{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main&nbsp;(String&nbsp;args[])&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address&nbsp;address&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Address();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address.setStreet(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">wall&nbsp;street</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address.setCountry(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">united&nbsp;states</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fout&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileOutputStream(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">c:\\address.ser</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;oos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ObjectOutputStream(fout);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oos.writeObject(address);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oos.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Done</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">catch</span><span style="color: #000000;">(Exception&nbsp;ex){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br /><h4>1.3 ReadObject.java</h4><p style="margin: 0px 0px 20px; font-size: 14px; line-height: 21px;">A simple class to read / deserialize the Address object from file &#8211; &#8220;c:\\address.ser&#8221;.</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.FileInputStream;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.ObjectInputStream;<br />&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;ReadObject{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main&nbsp;(String&nbsp;args[])&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address&nbsp;address;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;fin&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileInputStream(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">c:\\address.ser</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;ois&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ObjectInputStream(fin);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Address)&nbsp;ois.readObject();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ois.close();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(address);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">(Exception&nbsp;ex){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />}</span></div><br /><h4>2. Testing</h4><p style="margin: 0px 0px 20px; font-size: 14px; line-height: 21px;">Let do some testing to demonstrate the use of serialVersionUID.</p><h4>2.1 Same serialVersionUID</h4><p style="margin: 0px 0px 20px; font-size: 14px; line-height: 21px;">Same serialVersionUID , there is no problem during the deserialization process<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->javac&nbsp;Address.java<br />javac&nbsp;WriteObject.java<br />javac&nbsp;ReadObject.java<br />java&nbsp;WriteObject<br />java&nbsp;ReadObject<br />Street&nbsp;:&nbsp;wall&nbsp;street&nbsp;Country&nbsp;:&nbsp;united&nbsp;states</div><br /><h4>2.2 Different serialVersionUID</h4><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">In Address.java,&nbsp;<strong>change the serialVersionUID to 2L</strong>&nbsp;(it was 1L), and compile it again.<br /></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->javac&nbsp;Address.java<br />java&nbsp;ReadObject<br />java.io.InvalidClassException:&nbsp;Address;&nbsp;local&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;incompatible:&nbsp;<br />stream&nbsp;classdesc&nbsp;serialVersionUID&nbsp;=&nbsp;1,&nbsp;local&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;serialVersionUID&nbsp;=&nbsp;2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;ReadObject.main(ReadObject.java:14)</div><br /><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">The &#8220;<code style="padding: 4px; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 12px; color: #0f3b68; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: #f7f7f9; border: 1px solid #e1e1e8;">InvalidClassException</code>&#8221; will raise, because you write a serialization class with&nbsp;<strong>serialVersionUID &#8220;1L&#8221;</strong>&nbsp;but try to retrieve it back with updated serialization class,&nbsp;<strong>serialVersionUID &#8220;2L&#8221;</strong>.</p><blockquote style="padding: 0px 0px 0px 15px; border-left-width: 5px; border-left-color: #eeeeee; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;"><p style="margin: 0px; font-size: 16px; line-height: 1.875;">The serialVersionUID have to match during the serialization and deserialization process.</p></blockquote><h4>3. What&#8217;s wrong with the default serialVersionUID?</h4><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">If no serialVersionUID is declared, JVM will use its own algorithm to generate a default SerialVersionUID, you can check the algorithm&nbsp;<a href="http://docs.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100" target="_blank" style="color: #0f3b68;">here</a>.</p><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;"><strong>The default serialVersionUID computation is highly sensitive to class details and may vary from different JVM implementation</strong>, and result in an unexpected InvalidClassExceptions during the deserialization process.</p><h4>3.1 Client / Server environment</h4><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;"><em>- Client is using SUN&#8217;s JVM in Windows.<br />- Server is using JRockit in Linux.</em></p><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">The client sends a serializable class with default generated serialVersionUID (e.g 123L) to the server over socket, the server may generate a different serialVersionUID (e.g 124L) during deserialization process, and raises an unexpected InvalidClassExceptions.</p><h4>3.2 File / Database environment</h4><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;"><em>- App #1 is using SUN&#8217;s JVM in Windows.<br />- App #2 is using JRockit in Linux.</em></p><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">Serialization has allowed to save into a file or database. App #1 stores a serializable class into database by default generated serialVersionUID (e.g 123L), while App #2 may generate a different serialVersionUID (e.g 124L) during deserialization process, and raise an unexpected InvalidClassExceptions.</p><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">You can check here for the&nbsp;<a href="http://en.wikipedia.org/wiki/List_of_JVM_implementations" target="_blank" style="color: #0f3b68;">List of the JVM implementation</a>.</p><h4>4. How to generate serialVersionUID</h4><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">You can use JDK &#8220;<code style="padding: 4px; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 12px; color: #0f3b68; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: #f7f7f9; border: 1px solid #e1e1e8;">serialver</code>&#8221; or Eclipse IDE to generate serialVersionUID automatically,&nbsp;<a href="http://www.mkyong.com/java/how-to-generate-serialversionuid/" target="_blank" style="color: #0f3b68;">see detail</a>.</p><h4>Conclusion</h4><p style="margin: 0px 0px 20px; color: #3c3c3c; font-family: Arial, sans-serif; font-size: 14px; line-height: 21px; background-color: #ffffff;">SUN is highly recommended developers to declare the serialVersionUID in order to avoid the different JVM issue listed above, however I rather recommend you should understand what is serialization, how serialVersionUID implement version control and why your class need to use serialization. Understand the serialVersionUID concept is better than blindfold to any recommendation.</p></p><p>&nbsp;</p><p>&nbsp;</p><img src ="http://www.blogjava.net/czihong/aggbug/392130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-28 12:01 <a href="http://www.blogjava.net/czihong/articles/392130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Runnable Callable Future and Executor in Java</title><link>http://www.blogjava.net/czihong/articles/391960.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Mon, 26 Nov 2012 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/391960.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/391960.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/391960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/391960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/391960.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">Refer to:&nbsp;</span>http://blog.csdn.net/zhangzhaokun/article/details/6615454<br /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br /></span><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">Executor就是Runnable和Callable的调度容器，Future就是对于具体的调度任务的执行结果进行查看，最为关键的是Future可以检查对应的任务是否已经完成，也可以阻塞在get方法上一直等待任务返回结果。Runnable和Callable的差别就是Runnable是没有结果可以返回的，就算是通过Future也看不到任务调度的结果的。&nbsp;<br /><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">package</span>&nbsp;com.future.demo;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.Callable;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.ExecutorService;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.Executors;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.Future;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;RunnableAndCallable2Future&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建一个执行任务的服务</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecutorService&nbsp;executor&nbsp;=&nbsp;Executors.newFixedThreadPool(3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;1.Runnable通过Future返回结果为空<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建一个Runnable，来调度，等待任务执行完毕，取得返回结果</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future&lt;?&gt;&nbsp;runnable1&nbsp;=&nbsp;executor.submit(<span style="color: #0000FF; ">new</span>&nbsp;Runnable()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("runnable1&nbsp;running.");<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;System.out.println("Runnable1:"&nbsp;+&nbsp;runnable1.get());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;2.Callable通过Future能返回结果<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;提交并执行任务，任务启动时返回了一个&nbsp;Future对象，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;如果想得到任务执行的结果或者是异常可对这个Future对象进行操作</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future&lt;String&gt;&nbsp;future1&nbsp;=&nbsp;executor.submit(<span style="color: #0000FF; ">new</span>&nbsp;Callable&lt;String&gt;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;call()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"result=task1";<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;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;获得任务的结果，如果调用get方法，当前线程会等待任务执行完毕后才往下执行</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("task1:&nbsp;"&nbsp;+&nbsp;future1.get());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;3.&nbsp;对Callable调用cancel可以对对该任务进行中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;提交并执行任务，任务启动时返回了一个&nbsp;Future对象，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;如果想得到任务执行的结果或者是异常可对这个Future对象进行操作</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future&lt;String&gt;&nbsp;future2&nbsp;=&nbsp;executor.submit(<span style="color: #0000FF; ">new</span>&nbsp;Callable&lt;String&gt;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;call()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<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;<span style="color: #0000FF; ">while</span>&nbsp;(<span style="color: #0000FF; ">true</span>)&nbsp;{<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;System.out.println("task2&nbsp;running.");<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;Thread.sleep(50);<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;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<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;System.out.println("Interrupted&nbsp;task2.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"task2=false";<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 /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;等待5秒后，再停止第二个任务。因为第二个任务进行的是无限循环</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("task2&nbsp;cancel:&nbsp;"&nbsp;+&nbsp;future2.cancel(<span style="color: #0000FF; ">true</span>));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;4.用Callable时抛出异常则Future什么也取不到了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;获取第三个任务的输出，因为执行第三个任务会引起异常<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;所以下面的语句将引起异常的抛出</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future&lt;String&gt;&nbsp;future3&nbsp;=&nbsp;executor.submit(<span style="color: #0000FF; ">new</span>&nbsp;Callable&lt;String&gt;()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;call()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Exception("task3&nbsp;throw&nbsp;exception!");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><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;System.out.println("task3:&nbsp;"&nbsp;+&nbsp;future3.get());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;停止任务执行服务</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executor.shutdownNow();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><img src ="http://www.blogjava.net/czihong/aggbug/391960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-26 11:59 <a href="http://www.blogjava.net/czihong/articles/391960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的getName(), .class 和forName()的区别</title><link>http://www.blogjava.net/czihong/articles/391875.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 23 Nov 2012 15:09:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/391875.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/391875.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/391875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/391875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/391875.html</trackback:ping><description><![CDATA[<ol style="margin: 0px; padding: 0px 0px 0px 50px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px; list-style: decimal;">首先这个函数或属性都是用来获得一个类型的Class对象。每一个类型在java虚拟机中都对应一个Class对象，该对象用于java虚拟机加载一个该类型的对象到内存中。</li><li style="margin: 0px; padding: 0px; list-style: decimal;">其次getClass都是用于一个Custom object的，.class用于一个类型(系统封装或者用户自定义类型)，比如People类型，而forName 是Class类型的一个静态函数，用于获得一个类型的Class对象。</li><li style="margin: 0px; padding: 0px; list-style: decimal;">getClass返回的Class对象，是在运行时确定的，而另外两个都是在编译的时候确定的。</li></ol><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">假如我们有两个类型People和Student，其中student继承自People。如果执行下面的代码：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><code class="java plain" style="line-height: 24px; font-size: 12px; white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: 'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important; min-height: auto !important;">People people = </code><code class="java keyword" style="line-height: 24px; font-size: 12px; white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: 'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important; min-height: auto !important; color: #0000ff !important;">new</code><span style="font-family: 'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 24px; background-color: #f8f8f8;">&nbsp;</span><code class="java plain" style="line-height: 24px; font-size: 12px; white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: 'Courier New', Consolas, 'Bitstream Vera Sans Mono', Courier, monospace !important; min-height: auto !important;">Student();</code><br /><span style="color: #0000FF; ">try</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Class.forName("People")&nbsp;==&nbsp;People.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Class.forName("People")&nbsp;==&nbsp;people.getClass());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(people.getClass()&nbsp;==&nbsp;People.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Class.forName("People"));<span style="color: #008000; ">//</span><span style="color: #008000; ">People</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(people.getClass());<span style="color: #008000; ">//</span><span style="color: #008000; ">Student</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(People.<span style="color: #0000FF; ">class</span>);<span style="color: #008000; ">//</span><span style="color: #008000; ">People</span><span style="color: #008000; "><br /></span>}<span style="color: #0000FF; ">catch</span>(Exception&nbsp;e)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />}<br />Student&nbsp;student&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Student();<br /><span style="color: #0000FF; ">try</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Class.forName("Student")&nbsp;==&nbsp;Student.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Class.forName("Student")&nbsp;==&nbsp;student.getClass());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(student.getClass()&nbsp;==&nbsp;Student.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Class.forName("Student"));<span style="color: #008000; ">//</span><span style="color: #008000; ">Student</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(student.getClass());<span style="color: #008000; ">//</span><span style="color: #008000; ">Student</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Student.<span style="color: #0000FF; ">class</span>);<span style="color: #008000; ">//</span><span style="color: #008000; ">Student</span><span style="color: #008000; "><br /></span>}<span style="color: #0000FF; ">catch</span>(Exception&nbsp;e)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />}</div></p><img src ="http://www.blogjava.net/czihong/aggbug/391875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-23 23:09 <a href="http://www.blogjava.net/czihong/articles/391875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Question Mark ? in Java</title><link>http://www.blogjava.net/czihong/articles/391846.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 23 Nov 2012 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/391846.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/391846.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/391846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/391846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/391846.html</trackback:ping><description><![CDATA[<br /><span style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;">Parent Class</span><br style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;&nbsp;Parent&nbsp;&nbsp;{<br />&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;your&nbsp;code&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;}&nbsp;</div>&nbsp;<br style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;">Child Class</span><br style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;&nbsp;Child&nbsp;&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;&nbsp;Parent&nbsp;{<br />&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;your&nbsp;code&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;}&nbsp;</div><br style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;&nbsp;java.util.List;<br />&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;&nbsp;com.test.Child;<br />&nbsp;<span style="color: #0000ff;">import</span>&nbsp;&nbsp;java.util.ArrayList;<br /><br />&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;&nbsp;Test&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;&nbsp;doTest(List&nbsp;&lt;&nbsp;Parent&nbsp;&gt;&nbsp;&nbsp;list)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;&lt;&nbsp;Parent&nbsp;&gt;&nbsp;&nbsp;parentList&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;&nbsp;ArrayList&nbsp;&lt;&nbsp;Parent&nbsp;&gt;&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;&lt;&nbsp;Child&nbsp;&gt;&nbsp;&nbsp;childList&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;&nbsp;ArrayList&nbsp;&lt;&nbsp;Child&nbsp;&gt;&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doTest(parentList);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Compile Error&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doTest(childList);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />}&nbsp;</div><br />See addAll Method in ArrayList<br style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;&nbsp;addAll(Collection&nbsp;&lt;?&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;&nbsp;E&nbsp;&gt;&nbsp;&nbsp;c)&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;a&nbsp;&nbsp;=&nbsp;&nbsp;c.toArray();<br />&nbsp; &nbsp; <span style="color: #0000FF; ">int</span>&nbsp;&nbsp;numNew&nbsp;&nbsp;=&nbsp;&nbsp;a.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;ensureCapacity(size&nbsp;&nbsp;+&nbsp;&nbsp;numNew);&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Increments&nbsp;modCount&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp; &nbsp; System.arraycopy(a,&nbsp;&nbsp;0&nbsp;,&nbsp;elementData,&nbsp;size,&nbsp;numNew);<br />&nbsp; &nbsp; size&nbsp;&nbsp;+=&nbsp;&nbsp;numNew;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;numNew&nbsp;&nbsp;!=&nbsp;&nbsp;&nbsp;0&nbsp;;<br />&nbsp;}</div><br style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br />Modify Our Code<br style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;&nbsp;java.util.ArrayList;<br />&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;&nbsp;java.util.List;<br /><br /><br />&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;&nbsp;Test&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Change&nbsp;Our&nbsp;Method&nbsp;at&nbsp;Here</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;&nbsp;doTest(List&nbsp;&lt;?&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;&nbsp;Parent&nbsp;&gt;&nbsp;&nbsp;list)&nbsp;{<br />&nbsp; &nbsp; &nbsp; }&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">&nbsp; &nbsp; &nbsp; public</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;List&nbsp;&lt;&nbsp;Parent&nbsp;&gt;&nbsp;&nbsp;parentList&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;&nbsp;ArrayList&nbsp;&lt;&nbsp;Parent&nbsp;&gt;&nbsp;();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;List&nbsp;&lt;&nbsp;Child&nbsp;&gt;&nbsp;&nbsp;childList&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;&nbsp;ArrayList&nbsp;&lt;&nbsp;Child&nbsp;&gt;&nbsp;();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;doTest(parentList);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Compile&nbsp;Correct&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doTest(childList)&nbsp;<br />&nbsp; &nbsp; &nbsp;}&nbsp;<br />}&nbsp;</div><img src ="http://www.blogjava.net/czihong/aggbug/391846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-23 15:47 <a href="http://www.blogjava.net/czihong/articles/391846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Understand TheadLocal</title><link>http://www.blogjava.net/czihong/articles/391824.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 23 Nov 2012 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/391824.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/391824.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/391824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/391824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/391824.html</trackback:ping><description><![CDATA[<div>Core concept of ThreadLocal is, &#8220;every thread that accesses a ThreadLocal variable via its get or set method has its own, independently initialized copy of the variable&#8221;. In this tutorial we will learn about ThreadLocal.</div><div></div><div><strong>ThreadLocal Introduction</strong></div><div></div><div>We want to have separate instances(private copy) of a class so that there will not be any conflict among multiple threads. Each instance will be unique for each thread. This is nothing but a way of implementing threadsafety.</div><div>An important point about ThreadLocal variable is the global access. It can be accessed from anywhere inside the thread. Also note that, it is declared static and final.</div><div></div><div><strong>What is threadsafe?</strong></div><div></div><div>A thread is a single line of process. When we refer multi-threaded applications, we mean that there mulitple (sequential flow of control) line of process that runs through the same lines of code. In such situation, there is a possibility of one sequence(thread) accessing/modifying data of other sequence(thread). When data cannot be shared like this, then we make it threadsafe. Following are the some of the different ways of implementing threadsafe operation:</div><div></div><div><ol><li><span style="color: #0000ff;">Re-entrancy</span></li><li><span style="color: #0000ff;">Mutual exclusion (synchronization)</span></li><li><span style="color: #0000ff;">Thread-local</span></li><li><span style="color: #0000ff;">Atomic operation</span></li></ol></div><div></div><div>So, in the above list Thread-local is one option. Hope now we get how ThreadLocal fits in the cube.</div><div></div><div><strong>Uses of ThreadLocal</strong></div><div></div><div></div><div><ol><li>Genuine per-thread context, such as user id or transaction id. Works great. Easy to clean up when the thread exits the scope. No leaks.</li><li>Per-thread instances for performance.</li><li>&#8220;Sleazing&#8221; values through callbacks that you don&#8217;t control: sometimes you must call a library method that calls back into your package. At this point, you need some context that you were unable to pass to yourself, due to deficiencies in the library. In this rare situation, thread locals can be a lifesaver.</li></ol></div><div>Above points, in my own terms: We have an object that is not threadsafe and we want to use it safely. We go for synchronization by enclosing that object in synchronized block. Other way around is using ThreadSafe, what it does is holds separate instance for each thread and makes it safe.</div><div>&nbsp;</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">import</span>&nbsp;java.text.SimpleDateFormat;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ThreadLocalExample&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ThreadLocal&nbsp;formatter&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ThreadLocal()&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;SimpleDateFormat&nbsp;initialValue()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SimpleDateFormat("yyyyMMdd&nbsp;HHmm");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;};<br />&nbsp;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;formatIt(Date&nbsp;date)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;formatter.get().format(date);<br />&nbsp;&nbsp;}<br />}</div></div><div></div><div>In the above sample code, get() method is key to understanding. It returns the value in the current thread&#8217;s copy of this thread-local variable. If the variable has no value for the current thread, it is first initialized to the value returned by an invocation of the initialValue method.</div><div></div><div><strong>Example from javadoc</strong></div><div></div><div>The class below generates unique identifiers local to each thread. A thread&#8217;s id is assigned the first time it invokes ThreadId.get() and remains unchanged on subsequent calls.</div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">import</span>&nbsp;java.util.concurrent.atomic.AtomicInteger;<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ThreadId&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Atomic&nbsp;integer&nbsp;containing&nbsp;the&nbsp;next&nbsp;thread&nbsp;ID&nbsp;to&nbsp;be&nbsp;assigned</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;AtomicInteger&nbsp;nextId&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;AtomicInteger(0);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Thread&nbsp;local&nbsp;variable&nbsp;containing&nbsp;each&nbsp;thread's&nbsp;ID</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ThreadLocal&nbsp;threadId&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ThreadLocal()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;Integer&nbsp;initialValue()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nextId.getAndIncrement();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Returns&nbsp;the&nbsp;current&nbsp;thread's&nbsp;unique&nbsp;ID,&nbsp;assigning&nbsp;it&nbsp;if&nbsp;necessary</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;get()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;threadId.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><div><br /><strong>Use of ThreadLocal in Java API</strong></div><div></div><div>In JDK 1.7 we have got a new class namely ThreadLocalRandom. It can be used to generate random numbers specific to parallel threads. Seed for random number will be unique for each thread. This is a real cool utility.</div><div></div><div>Following is the code that implements ThreadLocal in the above class:</div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ThreadLocal&nbsp;localRandom&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ThreadLocal()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;ThreadLocalRandom&nbsp;initialValue()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ThreadLocalRandom();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />};</div></div><div></div><div>Example using ThreadLocalRandom</div><div>&nbsp;</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">import</span>&nbsp;java.util.concurrent.ThreadLocalRandom;<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ThreadLocalRandomExample&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String&nbsp;args[])&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InterruptedException&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">tossing&nbsp;3&nbsp;coins</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;3;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Thread&nbsp;thread&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Thread()&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(Thread.currentThread().getName()&nbsp;+&nbsp;":");<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;generating&nbsp;3&nbsp;random&nbsp;numbers&nbsp;-&nbsp;random&nbsp;for&nbsp;every&nbsp;thread</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;3;&nbsp;j++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;random&nbsp;=&nbsp;ThreadLocalRandom.current().nextInt(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(random&nbsp;+&nbsp;",");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.join();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}</div></div><img src ="http://www.blogjava.net/czihong/aggbug/391824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-23 11:24 <a href="http://www.blogjava.net/czihong/articles/391824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>μJavaActors </title><link>http://www.blogjava.net/czihong/articles/391651.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Tue, 20 Nov 2012 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/391651.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/391651.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/391651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/391651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/391651.html</trackback:ping><description><![CDATA[Refer to:&nbsp;http://www.ibm.com/developerworks/cn/java/j-javaactors/?cmp=dwnpr&amp;cpb=dw&amp;ct=dwcon&amp;cr=cn_51CTO_dl&amp;ccy=cn<img src ="http://www.blogjava.net/czihong/aggbug/391651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-20 15:33 <a href="http://www.blogjava.net/czihong/articles/391651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象的串行化（Serialization）</title><link>http://www.blogjava.net/czihong/articles/391245.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Tue, 13 Nov 2012 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/391245.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/391245.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/391245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/391245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/391245.html</trackback:ping><description><![CDATA[<div>一、串行化的概念和目的&nbsp;</div><div></div><div>1.什么是串行化&nbsp;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对象的寿命通常随着生成该对象的程序的终止而终止。有时候，可能需要将对象的状态保存下来，在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己 ，这个过程叫对象的串行化(Serialization) 。串行化的主要任务是写出对象实例变量的数值。如果交量是另一对象的引用，则引用的对象也要串行化。这个过程是递归的，串行化可能要涉及一个复杂树结构的单行化，包括原有对象、对象的对象、对象的对象的对象等等。对象所有权的层次结构称为图表(graph)。&nbsp;</div><div></div><div>2.串行化的目的&nbsp;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Java对象的单行化的目标是为Java的运行环境提供一组特性，如下所示：&nbsp;</div><div></div><div>1) &nbsp; &nbsp; &nbsp; 尽量保持对象串行化的简单扼要 ，但要提供一种途径使其可根据开发者的要求进行扩展或定制。&nbsp;</div><div></div><div>2) &nbsp; &nbsp; &nbsp; 串行化机制应严格遵守Java的对象模型 。对象的串行化状态中应该存有所有的关于种类的安全特性的信息。&nbsp;</div><div></div><div>3) &nbsp; &nbsp; &nbsp; 对象的串行化机制应支持Java的对象持续性。&nbsp;</div><div></div><div>4) &nbsp; &nbsp; &nbsp; 对象的串行化机制应有足够的 可扩展能力以支持对象的远程方法调用(RMI)。&nbsp;</div><div></div><div>5) &nbsp; &nbsp; &nbsp; 对象串行化应允许对象定义自身 的格式即其自身的数据流表示形式，可外部化接口来完成这项功能。</div><div></div><div>&nbsp;</div><div></div><div>&nbsp;</div><div></div><div>&nbsp;</div><div></div><div>二、串行化方法&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 从JDK1.1开始，Java语言提供了对象串行化机制 ，在java.io包中，接口Serialization用来作为实现对象串行化的工具 ，只有实现了Serialization的类的对象才可以被串行化。&nbsp;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Serializable接口中没有任何的方法。当一个类声明要实现Serializable接口时，只是表明该类参加串行化协议，而不需要实现任何特殊的方法。下面我们通过实例介绍如何对对象进行串行化。&nbsp;</div><div></div><div>1.定义一个可串行化对象&nbsp;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个类，如果要使其对象可以被串行化，必须实现Serializable接口。我们定义一个类Student如下：</div><p>&nbsp;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">import</span>&nbsp;java.io.Serializable;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Student&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Serializable&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;id;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;学号&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;姓名&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;age;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;年龄&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;department;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;系别&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Student(<span style="color: #0000FF; ">int</span>&nbsp;id,&nbsp;String&nbsp;name,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;age,&nbsp;String&nbsp;department)&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.id&nbsp;=&nbsp;id;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.age&nbsp;=&nbsp;age;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.department&nbsp;=&nbsp;department;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />} &nbsp;</div><br /><div>2.构造对象的输入／输出流&nbsp;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 要串行化一个对象，必须与一定的对象输出／输入流联系起来，通过对象输出流将对象状态保存下来，再通过对象输入流将对象状态恢复。&nbsp;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; java.io包中，提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象 。在ObjectInputStream 中用readObject()方法可以直接读取一个对象，ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">import</span>&nbsp;java.io.FileInputStream;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileOutputStream;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.ObjectInputStream;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.ObjectOutputStream;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ObjectSer&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String&nbsp;args[])&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassNotFoundException&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;stu&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Student(981036,&nbsp;"LiuMing",&nbsp;18,&nbsp;"CSD");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fo&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FileOutputStream("data.ser");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;so&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ObjectOutputStream(fo);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;so.writeObject(stu);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;so.close();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;fi&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FileInputStream("data.ser");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;si&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ObjectInputStream(fi);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu&nbsp;=&nbsp;(Student)&nbsp;si.readObject();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.close();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Student&nbsp;Info:");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("ID:"&nbsp;+&nbsp;stu.id);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Name:"&nbsp;+&nbsp;stu.name);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Age:"&nbsp;+&nbsp;stu.age);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Dep:"&nbsp;+&nbsp;stu.department);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />} &nbsp;</div><div>运行结果如下：</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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 />-->Student&nbsp;Info:&nbsp;<br /><br />ID:981036&nbsp;<br /><br />Name:LiuMing&nbsp;<br /><br />Age:18&nbsp;<br /><br />Dep:CSD</div><br /><div>&nbsp;在这个例子中，我们首先定义了一个类Student，实现了Serializable接口 ，然后通过对象输出流的writeObject()方法将Student对象保存到文件 data.ser中 。之后，通过对家输入流的readObjcet()方法从文件data.ser中读出保存下来的Student对象 。从运行结果可以看到，通过串行化机制，可以正确地保存和恢复对象的状态。&nbsp;</div><div></div><div>三、串行化的注意事项&nbsp;</div><div>1.串行化能保存的元素&nbsp;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 串行化只能保存对象的非静态成员交量，不能保存任何的成员方法和静态的成员变量，而且串行化保存的只是变量的值，对于变量的任何修饰符都不能保存。&nbsp;</div><div></div><div>2.transient关键字&nbsp;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 对于某些类型的对象，其状态是瞬时的，这样的对象是无法保存其状态的。例如一个Thread对象或一个FileInputStream对象 ，对于这些字段，我们必须用transient关键字标明，否则编译器将报措。&nbsp;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 另外 ，串行化可能涉及将对象存放到 磁盘上或在网络上发达数据，这时候就会产生安全问题。因为数据位于Java运行环境之外，不在Java安全机制的控制之中。对于这些需要保密的字段，不应保存在永久介质中 ，或者不应简单地不加处理地保存下来 ，为了保证安全性。应该在这些字段前加上transient关键字。<br /></div></div><img src ="http://www.blogjava.net/czihong/aggbug/391245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-13 11:04 <a href="http://www.blogjava.net/czihong/articles/391245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>notify() and wait()</title><link>http://www.blogjava.net/czihong/articles/390720.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 03 Nov 2012 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390720.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390720.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390720.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 通常，多线程之间需要协调工作。例如，浏览器的一个显示图片的线程displayThread想要执行显示图片的任务，必须等待下载线程downloadThread将该图片下载完毕。如果图片还没有下载完，displayThread可以暂停，当downloadThread完成了任务后，再通知displayThread&#8220;图片准备完毕，可以显示了&#8221;，这时，displayThread继续执...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/390720.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/390720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-03 11:18 <a href="http://www.blogjava.net/czihong/articles/390720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hashcode() and equal()</title><link>http://www.blogjava.net/czihong/articles/390719.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 03 Nov 2012 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390719.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390719.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390719.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390719.html</trackback:ping><description><![CDATA[<strong style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">equal方法</strong>&nbsp;<br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">Object类的equals方法用于检测一个对象是否等于另外一个对象，而Object类中这个方法的定义为两个对象是否具有相同的引用。源码如下：&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.200000762939453px; "><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold; ">Java代码<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;equals(Object&nbsp;obj)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(<span style="color: #0000FF; ">this</span>&nbsp;==&nbsp;obj);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</div></div></div></div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">看起来没有什么问题，两个对象具有相同的引用，那这两个对象一定是相等的，但在实际应用中，这样的比较其实并没有什么实际意义，经常发生的场景就是需要比较两个对象的状态的相等性，比如某个对象的唯一性标识一致我们就认为这两个对象相等。java规范中对equal方法有如下要求&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">自反性：对于任何非空引用x,x,equal(x)应该返回true&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">对称性：对于任何引用x，x如果x.equal(y)返回true，那么y.equal(x)也应该返回true&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">传递性：对于任何x，y，z，如果x.equal(y)返回true，y.equal(z)返回true，那么z.equal(x)返回true也应该返回true。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">一致性：如果x，y的引用没有发生变化，那么反复调用equal方法应该返回同样的结果&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">非空性：对于任意非空引用x，x.equal(null)都应该返回false&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">为了满足实际需要，这个时候我们就需要重写equal方法，针对规范，比较典型的写法如下：&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.200000762939453px; "><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold; ">Java代码&nbsp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #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;&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;GraMind&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;obj&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@exception</span><span style="color: #008000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@see</span><span style="color: #008000; ">&nbsp;java.lang.Object#equals(java.lang.Object)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;equals(Object&nbsp;obj)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">this</span>&nbsp;==&nbsp;obj)&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(obj&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(getClass()&nbsp;!=&nbsp;obj.getClass())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassName&nbsp;other&nbsp;=&nbsp;(ClassName)&nbsp;obj;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(id&nbsp;!=&nbsp;other.id)&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;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</div></div></div></div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">对于上面的代码&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">1）检测两者是否引用同一个对象&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">2）检测object是否为null，如果为null直接返回false&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">3）避免父子类引用相同的域（比如上类父子都具有id属性），比较是否属于同一级类，如果每个子类都具有统一的语义也可以使用instanceof来检测&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">4)转换要比较的类为对应的类类型变量&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">5)根据需要比较相应的域&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">注意：如果在子类中重写了equal方法，就要在其中包含super.equal(...)。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><strong style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">散列码</strong>&nbsp;<br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">散列码是有对象导出来的一个整形值，且没有规律。如果重写equal方法那么就必须重写hashCode方法&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">想要明白为什么这样做，你必须要先知道Java中的集合。　　&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">总的来说，Java中的集合（Collection）有两类，一类是List，再有一类是Set。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">你知道它们的区别吗？前者集合内的元素是有序的，元素可以重复；后者元素无序，但元素不可重复。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">那么这里就有一个比较严重的问题了：要想保证元素不重复，可两个元素是否重复应该依据什么来判断呢？&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">这就是Object.equals方法了。但是，如果每增加一个元素就检查一次，那么当元素很多时，后添加到集合中的元素比较的次数就非常多了。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">也就是说，如果集合中现在已经有1000个元素，那么第1001个元素加入集合时，它就要调用1000次equals方法。这显然会大大降低效率。&nbsp;&nbsp;&nbsp;&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">于是，Java采用了哈希表的原理。哈希（Hash）实际上是个人名，由于他提出一哈希算法的概念，所以就以他的名字命名了。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">哈希算法也称为散列算法，是将数据依特定算法直接指定到一个地址上。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">初学者可以这样理解，hashCode方法实际上返回的就是对象存储的物理地址（实际可能并不是，比如大家可以看下String的hashCode实现）。&nbsp;&nbsp;&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">这样一来，当集合要添加新的元素时，先调用这个元素的hashCode方法，就一下子能定位到它应该放置的物理位置上。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">如果这个位置上没有元素，它就可以直接存储在这个位置上，不用再进行任何比较了；如果这个位置上已经有元素了，&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">就调用它的equals方法与新元素进行比较，相同的话就不存了，不相同就散列其它的地址。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了，几乎只需要一两次。&nbsp;&nbsp;&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">所以，Java对于eqauls方法和hashCode方法是这样规定的：&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">1、如果两个对象相同，那么它们的hashCode值一定要相同；2、如果两个对象的hashCode相同，它们并不一定相同&nbsp;&nbsp;&nbsp;&nbsp; 上面说的对象相同指的是用eqauls方法比较。&nbsp;</span><img src ="http://www.blogjava.net/czihong/aggbug/390719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-03 11:00 <a href="http://www.blogjava.net/czihong/articles/390719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring依赖注入的三种方式</title><link>http://www.blogjava.net/czihong/articles/390716.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 03 Nov 2012 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390716.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390716.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390716.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">Spring<span style="font-family: 宋体; ">依赖注入（</span>DI<span style="font-family: 宋体; ">）的三种方式，分别为：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; ">1．<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;</span><span style="font-family: 宋体; ">接口注入</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; ">2．<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;</span>Setter<span style="font-family: 宋体; ">方法注入</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; ">3．<span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;</span><span style="font-family: 宋体; ">构造方法注入</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-family: 宋体; ">下面介绍一下这三种依赖注入在</span>Spring<span style="font-family: 宋体; ">中是怎么样实现的。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-family: 宋体; ">首先我们需要以下几个类：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-family: 宋体; ">接口</span>&nbsp;Logic.java</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-family: 宋体; ">接口实现类</span>&nbsp;LogicImpl.java</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-family: 宋体; ">一个处理类</span>&nbsp;LoginAction.java</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-family: 宋体; ">还有一个测试类</span>&nbsp;TestMain.java</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">Logic.java<span style="font-family: 宋体; ">如下：</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;com.spring.test.di;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong>&nbsp;<strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">interface</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;<span style="background-color: silver; background-position: initial initial; background-repeat: initial initial; ">Logic</span>&nbsp;{</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;String getName();</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">}</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">LogicImpl.java<span style="font-family: 宋体; ">如下：</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;com.spring.test.di;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong>&nbsp;<strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;LogicImpl&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;Logic{</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;String getName(){</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">return</span></strong>&nbsp;<span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; ">"fengyun"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">TestMain.java</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">package com.spring.test.di;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">import org.springframework.context.ApplicationContext;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">import org.springframework.context.support.FileSystemXmlApplicationContext;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">public class TestMain {</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @param args</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">得到</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">ApplicationContext</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">对象</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext ctx = new FileSystemXmlApplicationContext(</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"applicationContext.xml");</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">得到</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">Bean</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoginAction loginAction = (LoginAction) ctx.getBean("loginAction");</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loginAction.execute();</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">LoginAction.java&nbsp;<span style="font-family: 宋体; ">会根据使用不同的注入方法而稍有不同</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-family: 宋体; ">下面按照注入的方法来看</span>LoginAction.java<span style="font-family: 宋体; ">类</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">Setter<span style="font-family: 宋体; ">方法注入：</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;com.spring.test.di;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong>&nbsp;<strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;LoginAction {</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;Logic&nbsp;</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'; ">logic</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong>&nbsp;<strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;execute() {</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name =&nbsp;</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'; ">logic</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">.getName();</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'; ">out</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">.print(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; ">"My Name Is "</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;+ name);&nbsp;&nbsp;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">/**</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">*</span>&nbsp;<strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'; ">@return</span></strong>&nbsp;<span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">the</span>&nbsp;<span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">logic</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">*/</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;Logic getLogic() {</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">return</span></strong>&nbsp;<span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'; ">logic</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">/**</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">*</span>&nbsp;<strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'; ">@param</span></strong>&nbsp;<span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">logic</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">*</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">the</span>&nbsp;<span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">logic</span>&nbsp;<span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">to</span>&nbsp;<span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">set</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'; ">*/</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong>&nbsp;<strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;setLogic(Logic logic) {</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">.</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'; ">logic</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;= logic;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; font-family: 宋体; ">定义了一个</span><span style="font-size: 10pt; font-family: 'Courier New'; ">Logic&nbsp;</span><span style="font-size: 10pt; font-family: 宋体; ">类型的变量</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;logic,&nbsp;</span><span style="font-size: 10pt; font-family: 宋体; ">在</span><span style="font-size: 10pt; font-family: 'Courier New'; ">LoginAction</span><span style="font-size: 10pt; font-family: 宋体; ">并没有对</span><span style="font-size: 10pt; font-family: 'Courier New'; ">logic&nbsp;</span><span style="font-size: 10pt; font-family: 宋体; ">进行实例化，而只有他对应的</span><span style="font-size: 10pt; font-family: 'Courier New'; ">setter/getter</span><span style="font-size: 10pt; font-family: 宋体; ">方法，因为我们这里使用的是</span><span style="font-size: 10pt; font-family: 'Courier New'; ">Spring</span><span style="font-size: 10pt; font-family: 宋体; ">的依赖注入的方式</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; font-family: 'Courier New'; ">applicationContext.xml</span><span style="font-size: 10pt; font-family: 宋体; ">配置文件如下</span><span style="font-size: 10pt; font-family: 'Courier New'; ">:</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">bean</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;<span style="color: #7f007f; ">id</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"logic"</span></em>&nbsp;<span style="color: #7f007f; ">class</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"com.spring.test.di.LogicImpl"</span></em><span style="color: teal; ">/&gt;</span></span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">bean</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;<span style="color: #7f007f; ">id</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"loginAction"</span></em>&nbsp;<span style="color: #7f007f; ">class</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"com.spring.test.di.LoginAction"</span></em><span style="color: teal; ">&gt;</span></span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;<span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">property</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;<span style="color: #7f007f; ">name</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"logic"</span></em>&nbsp;<span style="color: #7f007f; ">ref</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"logic"</span></em><span style="color: teal; ">&gt;&lt;/</span><span style="color: #3f7f7f; ">property</span><span style="color: teal; ">&gt;</span></span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">bean</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&gt;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">现在可以运行</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">testMain.java</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">了，我们可以看到控制台打出了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;My Name Is fengyun</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">OK</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">了，这就是</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">spring</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">setter</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">方法注入，非常简单</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">下面我们来看看构造方法注入</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">顾名思义，构造方法注入，就是我们依靠</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">LoginAction</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">的构造方法来达到</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">DI</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">的目的，如下所示：</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">LoginAction.java</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">package com.spring.test.di;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">public class LoginAction {</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;private Logic logic;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;public LoginAction(Logic logic) {</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.logic = logic;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;public void execute() {</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name = logic.getName();</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("My Name Is " + name);</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">}</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">这里我们添加了一个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">LoginAction</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">的构造方法</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; font-family: 'Courier New'; ">applicationContext.xml</span><span style="font-size: 10pt; font-family: 宋体; ">配置文件如下</span><span style="font-size: 10pt; font-family: 'Courier New'; ">:</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">bean</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;<span style="color: #7f007f; ">id</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"logic"</span></em>&nbsp;<span style="color: #7f007f; ">class</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"com.spring.test.di.LogicImpl"</span></em><span style="color: teal; ">/&gt;</span></span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">bean</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;<span style="color: #7f007f; ">id</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"loginAction"</span></em>&nbsp;<span style="color: #7f007f; ">class</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"com.spring.test.di.LoginAction"</span></em><span style="color: teal; ">&gt;</span></span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;<span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">constructor-arg</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;<span style="color: #7f007f; ">index</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"0"</span></em>&nbsp;<span style="color: #7f007f; ">ref</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"logic"</span></em><span style="color: teal; ">&gt;&lt;/</span><span style="color: #3f7f7f; ">constructor-arg</span><span style="color: teal; ">&gt;</span></span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">bean</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&gt;</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; font-family: 宋体; ">我们使用</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">constructor-arg</span><span style="font-size: 10pt; font-family: 宋体; ">来进行配置</span><span style="font-size: 10pt; font-family: 'Courier New'; ">, index</span><span style="font-size: 10pt; font-family: 宋体; ">属性是用来表示构造方法中参数的顺序的，如果有多个参数，则按照顺序，从</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;0,1...</span><span style="font-size: 10pt; font-family: 宋体; ">来配置</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; font-family: 宋体; ">我们现在可以运行</span><span style="font-size: 10pt; font-family: 'Courier New'; ">testMain.java</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">,</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">结果跟使用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">Setter</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">方法注入完全一样</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">.</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">其中需要注意一点有：构造函数有多个参数的话，如：参数</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">1</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">，参数</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">2</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">，而参数</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">2</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">依赖于参数</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">1</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">，这中情况则要注意构造函数的顺序，必须将参数</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">1</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">放在参数</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">2</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">之前。</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 宋体; ">下面继续说说我们不常用到的接口注入，还是以</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">LogicAction</span><span style="font-size: 10pt; color: black; font-family: 宋体; ">为例，我们对他进行了修改，如下所示：</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">LogicAction.java</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;com.spring.test.di;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong>&nbsp;<strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;LoginAction {</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">private</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;Logic&nbsp;</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'; ">logic</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">public</span></strong>&nbsp;<strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;execute() {</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">try</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;{</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object obj = Class.<em>forName</em>(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; ">"com.spring.test.di.LogicImpl"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">)</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.newInstance();</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'; ">logic</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;= (Logic) obj;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name =&nbsp;</span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'; ">logic</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">.getName();</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'; ">out</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">.print(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'; ">"My Name Is "</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;+ name);</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'; ">catch</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;(Exception e) {</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: black; font-family: 'Courier New'; ">}</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; font-family: 宋体; ">配置文件：</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">bean</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;<span style="color: #7f007f; ">id</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"logic"</span></em>&nbsp;<span style="color: #7f007f; ">class</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"com.spring.test.di.LogicImpl"</span></em><span style="color: teal; ">/&gt;</span></span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">bean</span><span style="font-size: 10pt; font-family: 'Courier New'; ">&nbsp;<span style="color: #7f007f; ">id</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"loginAction"</span></em>&nbsp;<span style="color: #7f007f; ">class</span><span style="color: black; ">=</span><em><span style="color: #2a00ff; ">"com.spring.test.di.LoginAction"</span></em><span style="color: teal; ">&gt;</span></span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'; ">bean</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'; ">&gt;</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; font-family: 宋体; ">对于接口注入这种方式，以上也只是我个人理解，不知道是否有什么问题。呵呵</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; font-family: 宋体; ">我们最常用就是</span><span style="font-size: 10pt; font-family: 'Courier New'; ">Setter</span><span style="font-size: 10pt; font-family: 宋体; ">和构造函数这两种注入方法，至于他们各自的对比，我想在只要</span><span style="font-size: 10pt; font-family: 'Courier New'; ">baidu</span><span style="font-size: 10pt; font-family: 宋体; ">一下就可以有清楚的答案了。</span></p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 10pt; font-family: 宋体; ">对于</span><span style="font-size: 10pt; font-family: 'Courier New'; ">Spring</span><span style="font-size: 10pt; font-family: 宋体; ">的依赖注入，最重要的就是理解他的，一旦理解了，将会觉得非常的简单。无非就是让容器来给我们实例化那些类，我们要做的就是给容器提供这个接口，这个接口就我们的</span><span style="font-size: 10pt; font-family: 'Courier New'; ">set</span><span style="font-size: 10pt; font-family: 宋体; ">方法或者构造函数了。</span></p><img src ="http://www.blogjava.net/czihong/aggbug/390716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-03 09:12 <a href="http://www.blogjava.net/czihong/articles/390716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>show java gc log</title><link>http://www.blogjava.net/czihong/articles/386700.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 31 Aug 2012 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/386700.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/386700.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/386700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/386700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/386700.html</trackback:ping><description><![CDATA[<pre prettyprint"="" style="margin-top: 0px; margin-bottom: 10px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow-x: auto; overflow-y: auto; width: auto; max-height: 600px; line-height: 18px; text-align: left; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">-</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">verbose</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">:</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">gc </span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">-</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">XX</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">:+</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #2b91af; ">PrintGCTimeStamps</span> <span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">-</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">XX</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; ">:+</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #2b91af; ">PrintGCDetails</span></code></pre><img src ="http://www.blogjava.net/czihong/aggbug/386700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-08-31 16:03 <a href="http://www.blogjava.net/czihong/articles/386700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse Memory Analyzer介绍</title><link>http://www.blogjava.net/czihong/articles/386591.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Thu, 30 Aug 2012 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/386591.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/386591.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/386591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/386591.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/386591.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">Eclipse Memory Analyzer是一个非常棒的堆内存分析工具，是JDK自带的堆分析工具jhat的一个非常好的替代品，能够快速地定位Java内存泄露的原因。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可能有的同学会问，JVM不是号称自动内存管理，GC会自动垃圾回收，Java怎么会有内存泄露，不会搞错吧？当然不会^_^， Java的内存泄露不同于C/C++的内存泄露，C/C++的内存泄露是由于使用了堆内存(new/malloc)却没有释放(delete/free)，导致无法再使用到该内存片，而Java的内存泄露是无谓地引用了一些垃圾的对象，譬如我们有一个Map对象，不断往里面放对象，实际的场景可能是这些对象不会再被使用到，这时候，这部分数据本身是垃圾的（因为不会再被使用），但实际上JVM会不会释放它（因为还被Map）引用着，这就是Java的内存泄露。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在开始分析之前，我们先想想，在编程这个角度上，我们如何避免堆内存泄露呢？实际上java.lang.ref这个包已经为我们提供了一种问题解决方案。Java的引用有4种：强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、幻影引用(Phantom Reference)，关于这部分介绍的文章一大批，此处就不做深入，我们只需要知道如下的信息：</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">强引用：除非将引用置为null，否则JVM不会对它垃圾，这是最常用的引用方式</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">软引用：在堆内存不足的时候，GC会将其垃圾回收</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">弱引用：每次GC都会将其垃圾回收</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">幻影引用：跟没有引用一样，每次获得的都是空的，没有太多使用的意义，仅是为了追踪对象在JVM的状态</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般对于大数据量的Cache信息或大对象，使用软引用/弱引用是一种非常好的习惯，或者至少使用一种淘汰算法，避免在堆内存拥挤大量的对象导致内存不足，如下是两个非常好的JDK默认提供的HashMap替代者：</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">org.apache.commons.collections.map.ReferenceMap：支持强引用/软引用和弱引用来存储key/value对</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">org.apache.commons.collections.map.LRUMap：可以控制总容量，采用LRU淘汰算法，将不常使用的数据淘汰出去</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 介绍完一些背景，我们开始进入主题。在开始分析之前，我们需要先dump下JVM的堆内存信息（虽然Eclipse Memory Analyzer直接attach到JVM上获取栈再分析，实际应用价值不大）</p><div style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; margin-top: 0px; margin-right: 5px; margin-bottom: 5px; margin-left: 15px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; ">jmap &#8211;dump:file=test.bin {pid}</div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp; 现在我们有了test.bin这个堆文件，使用Eclipse Memory Analyzer打开，分析完堆，我们可以选择&#8220;Leak Suspects Report&#8221;进行内存泄露分析。通过这个视图，我们可以大概得到内存泄露的初步结论<br />&nbsp;<img alt="" width="430" src="http://dl.iteye.com/upload/picture/pic/61265/74c619b4-e323-33ac-bf04-30adf0e257db.png" height="265" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; " /><br />&nbsp;&nbsp;&nbsp;&nbsp; Historygram也是一个非常常用的视图，可以获得堆中对象的数据统计，有排序、过滤的功能，非常好用<br />&nbsp;<img alt="" width="539" src="http://dl.iteye.com/upload/picture/pic/61263/e44a8117-1a54-3563-9ff8-75ca821dd13a.png" height="262" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; " /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Eclipse Memory Analyzer还包括如下功能：</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">在Historygram视图中右击对象弹出的功能框中，可以获得对象相互引用的关系的功能</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Dominator Tree的视图采用Tree的方式来展现整个栈对象相互引用的情况</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">OQL视图支持使用OQL语言来查询对象信息</li></ul><img src ="http://www.blogjava.net/czihong/aggbug/386591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-08-30 13:58 <a href="http://www.blogjava.net/czihong/articles/386591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Increase Console Output in Eclipse</title><link>http://www.blogjava.net/czihong/articles/385685.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 17 Aug 2012 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/385685.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/385685.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/385685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/385685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/385685.html</trackback:ping><description><![CDATA[<span style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; ">Then you are executing applications that have a lot System.out.print.. output, you might want to increate size of your Console to hold more text.</span><br style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; " /><br style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; " /><span style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; ">Eclipse &gt; Preferences &gt; type in Console in search &gt; Run/Debug &gt; Console</span><br style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; " /><br style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; " /><span style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; ">Increase buffer size from default 80,000 characters to MAX 999999.</span><br style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; " /><br style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; " /><div style="color: #797979; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px; background-color: #ffffff; clear: both; text-align: center; "><a href="http://1.bp.blogspot.com/-jlC94ue6VNg/TntT_XPUT0I/AAAAAAAACh4/vIVJchrGSkM/s1600/Eclipse+Console+size.png" imageanchor="1" style="text-decoration: none; color: #84a3d6; margin-left: 1em; margin-right: 1em; "><img border="0" height="640" src="http://1.bp.blogspot.com/-jlC94ue6VNg/TntT_XPUT0I/AAAAAAAACh4/vIVJchrGSkM/s640/Eclipse+Console+size.png" width="617" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; position: relative; "  alt="" /></a></div><img src ="http://www.blogjava.net/czihong/aggbug/385685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-08-17 13:23 <a href="http://www.blogjava.net/czihong/articles/385685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memory leak tools</title><link>http://www.blogjava.net/czihong/articles/383461.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Wed, 18 Jul 2012 19:00:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/383461.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/383461.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/383461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/383461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/383461.html</trackback:ping><description><![CDATA[<div style="display: inline-block; "><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; text-align: left; ">JProfile or YourKit<br /><br />Finding a memory leak can be difficult, even when you've got some good tools to give you an idea what's happening in your heap. If you can narrow down the operations that are leak suspects that goes a long way to finding the problem.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; text-align: left; ">However, if you aren't sure where to start, your best bet is to find a good profiler that will let you walk the heap. My favorites are&nbsp;<a href="http://www.ej-technologies.com/products/jprofiler/overview.html" rel="nofollow" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #4a6b82; text-decoration: none; cursor: pointer; ">JProfiler</a>&nbsp;and&nbsp;<a href="http://www.yourkit.com/" rel="nofollow" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background-color: transparent; color: #4a6b82; text-decoration: none; cursor: pointer; ">YourKit</a>, though some of the others people here have suggested are decent as well. They both cost money, but getting a trial license isn't terribly difficult.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; text-align: left; ">Once in there you'll want to look for what objects are taking up the most heap size. Unfortunately, it's almost always char[], byte[], and String taking up the most space, so you can walk the heap to find what objects are holding onto the largest instances of those objects. Also, the profiler should have the ability to show you the deep size of an object, so be on the lookout for instances of your own classes that have fairly large deep sizes.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; text-align: left; ">Another technique is if you have a suspect operation, is to see if the heap is growing as you perform the operation. The profiler will have the ability to force a garbage collection (you can also do this through jconsole), so perform this operation before and after your operation and see if the heap has grown in size.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; background-color: #ffffff; clear: both; word-wrap: break-word; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; text-align: left; ">Sometimes the leak could be undetectable by these means though since you might see totally random results. A few months ago, I was looking at a leak that was caused by someone synchronizing the finalize method of an object which halted garbage collection. Another time, the leak wasn't a leak, but rather just a certain request was throwing out of memory because even though the heap was 50% free, there wasn't a large enough contiguous block for that request. So it's a lot of trail and error, and the best approach is to try to form a hypothesis and prove it to be true or false as quickly as you can.</p></div><img src ="http://www.blogjava.net/czihong/aggbug/383461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-07-19 03:00 <a href="http://www.blogjava.net/czihong/articles/383461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>