﻿<?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-cuiyi's blog（崔毅 crazycy）-随笔分类-JavaSE语言</title><link>http://www.blogjava.net/crazycy/category/8593.html</link><description>记录点滴 鉴往事之得失 以资于发展 </description><language>zh-cn</language><lastBuildDate>Thu, 27 Mar 2008 06:24:13 GMT</lastBuildDate><pubDate>Thu, 27 Mar 2008 06:24:13 GMT</pubDate><ttl>60</ttl><item><title>ClassLoader专题（六）：ear的新发现</title><link>http://www.blogjava.net/crazycy/archive/2008/03/27/188907.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Wed, 26 Mar 2008 16:36:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2008/03/27/188907.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/188907.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2008/03/27/188907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/188907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/188907.html</trackback:ping><description><![CDATA[测试环境：Jboss<br />
<br />
ear下允许jar的变体<br />
<br />
web-inf/lib 下不允许jar的变体<br />
其变体简洁的实质就是web-inf/classes<br />
<img src ="http://www.blogjava.net/crazycy/aggbug/188907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2008-03-27 00:36 <a href="http://www.blogjava.net/crazycy/archive/2008/03/27/188907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassLoader专题（五）：ear的阐述（引用） 和 验证后的推理</title><link>http://www.blogjava.net/crazycy/archive/2008/03/26/188822.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Wed, 26 Mar 2008 10:19:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2008/03/26/188822.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/188822.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2008/03/26/188822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/188822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/188822.html</trackback:ping><description><![CDATA[robbin在其文 http://www.javaeye.com/topic/11 中如下描述<br />
<br />
Java本身是一种设计的非常简单，非常精巧的语言，所以Java背后的原理也很简单，归结起来就是两点：
<br />
<br />
1、JVM的内存管理
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 理解了这一点，所有和对象相关的问题统统都能解决
<br />
<br />
2、JVM Class Loader
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 理解了这一点，所有和Java相关的配置问题，包括各种App Server的配置，应用的发布问题统统都能解决
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">App&nbsp;Class&nbsp;Loader<br />
</span><span style="color: rgb(0, 0, 0);">|-----</span><span style="color: rgb(0, 0, 0);">&nbsp;EJB&nbsp;Class&nbsp;Loader<br />
</span><span style="color: rgb(0, 0, 0);">|-----</span><span style="color: rgb(0, 0, 0);">&nbsp;Web&nbsp;App&nbsp;Class&nbsp;Loader <br />
</span></div>
<br />
<span style="background-color: rgb(200, 144, 255);">如果在App Class Loader级别配置，是全局可见的。<br />
如果打包在EJB里面，那么就不会影响到Web
Application，反之亦然，如果你在WEB-INF下面放置Hibernate，也不会影响到EJB。<br />
放在EJB Class
Loader或者放在Web App Class Loader级别主要就是在局部范围内有效，不影响到其它的应用。
<br />
<span style="background-color: rgb(255, 255, 255);"><span style="background-color: rgb(4, 0, 0);"><span style="background-color: rgb(255, 248, 255);">（<strong>＃me：这里是说ClassLoader都有一个加载边界＃</strong>）</span></span></span><br />
</span>
<br />
试想，如果在一个Weblogic上面配置多个虚拟域，你使用www.bruce.com域名，开发你的网站，我使用
www.fankai.com开发我的网站，那么当然不希望我们的Hibernate相互干扰，所以就可以放在 EJB Class
Loader级别来配置Hibernate。
<br />
<br />
<span style="background-color: rgb(239, 255, 120);">进一步阐述一下EJB Class Loader的问题：
</span><br />
<br />
先再次强调一下，Hibernate和EJB，和App
Server不存在兼容性问题，他们本来就是不相关的东西，就好像JDBC，相信没有人会认为JDBC和EJB不兼容吧，Hibernate也是一样，它
只和JDBC驱动，和数据库有兼容性问题，而和EJB，和App
Server完全是不搭界的两回事。凡是认为Hibernate和EJB不兼容的人，其实是都是因为对EJB学习的不到家，把责任推到Hibernate
身上了。
<br />
<br />
我前面的帖子提到过Class Loader的层次，这里不重复了，总之我们先来看看Class Loader的作用范围：
<br />
（＃me: BootStrap Class Loader会加载ExtClassLoader, 并设置其parent为null<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后BootStrap Class Loader会加载AppClassLoader,并设置其parent为ExtClassLoader<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后ExtClassLoader加载，AppClassLoader再加载＃）<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">BootStrap&nbsp;Class&nbsp;Loader:<br />
</span><span style="color: rgb(0, 0, 0);">&gt;&gt;&gt;&gt;&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;load&nbsp;JRE</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">lib</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">rt.jar,&nbsp;sunrsasign.jar,&nbsp;charsets.jar,&nbsp;jce.jar,&nbsp;jsse.jar,&nbsp;plugin.jar<br />
<br />
Ext&nbsp;Class&nbsp;Loader:<br />
</span><span style="color: rgb(0, 0, 0);">&gt;&gt;&gt;&gt;&gt;</span><span style="color: rgb(0, 0, 0);">load&nbsp;JRE</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">lib</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">ext目录下的库文件,&nbsp;load&nbsp;JRE</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">classes目录下的类</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 0);"><br />
App&nbsp;Class&nbsp;Loader:<br />
</span><span style="color: rgb(0, 0, 0);">&gt;&gt;&gt;&gt;&gt;</span><span style="color: rgb(0, 0, 0);">load&nbsp;CLASSPATH变量指定路径下的类<br />
<br />
以上的load路径都是写死在JVM的C</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">源代码里面的，不能改变，详细请见王森的《Java深度历险》 <br />
</span></div>
<br />
在一个特定的App Server上，Class Loader会继续向下继承，<span style="background-color: rgb(239, 255, 120);">继承的层次会根据不同的App Server有所不同</span>，但是肯定不会变的就是：
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">EJB&nbsp;Class&nbsp;Loader:<br />
</span><span style="color: rgb(0, 0, 0);">&gt;&gt;&gt;&gt;&gt;</span><span style="color: rgb(0, 0, 0);">继承自App&nbsp;Class&nbsp;Loader，继承层次根据App&nbsp;Server有所不同，<br />
</span><span style="color: rgb(0, 0, 0);">&gt;&gt;&gt;&gt;&gt;</span><span style="color: rgb(0, 0, 0);"><span style="color: red;">一个EJB&nbsp;Class&nbsp;Loader它的load&nbsp;Class的范围仅限于JAR或者EAR范围之内。</span><br />
<br />
Web&nbsp;App&nbsp;Class&nbsp;Loader:<br />
</span><span style="color: rgb(0, 0, 0);">&gt;&gt;&gt;&gt;&gt;</span><span style="color: rgb(0, 0, 0);">继承自App&nbsp;Class&nbsp;Loader，继承层次根据App&nbsp;Server有所不同，<br />
</span><span style="color: rgb(0, 0, 0);">&gt;&gt;&gt;&gt;&gt;</span><span style="color: rgb(0, 0, 0);"><span style="color: red;"><span style="color: rgb(0, 0, 0);">一个Web&nbsp;App&nbsp;Class&nbsp;Loader:它的load&nbsp;Class的范围在&nbsp;WEB</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">INF</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">lib下的库文件和WEB-INF</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">classes目录下的class文件。</span></span></span><span style="color: rgb(0, 0, 0);"> <br />
</span></div>
<br />
<span style="background-color: rgb(239, 255, 120);">Web App Class Loader很好理解</span>，大家毕竟用的很多，<strong>App Server上的一个Web
Application会创建一个Web App Class Loader的实例去负责load
class</strong>，所以如果你想让Hibernate只在这个Web Application内生效，把它放到WEB-INF"lib下去就好了。
<br />
<br />
如果你把Hibernate放到了CLASSPATH变量指定的路径下，而你在WEB-INF"lib也放了一份，那么Web App
Class
Loader由于load范围所限，它会首先找到WEB-INF"lib下的那份Hibernate，按照它的配置来初始化Hibernate。
<br />
<br />
如果你把Hibernate放到了CLASSPATH变量指定的路径下，但你在WEB-INF"lib什么都没有放，那么Web App
Class Loader由于load范围所限，它根本什么都找不到，于是它把load Hibernate的责任交给上一级的Class
Loader，这样直到App Class Loader，它找到了Hibernate，按照它的配置来初始化Hibernate。
<br />
<br />
<span style="background-color: rgb(239, 255, 120);">EJB Class Loader稍微复杂一点，不那么容易理解</span>。<strong>App Server会针对每一个EJB包文件创建一个EJB Class Loader的实例</strong>，例如：
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->HelloRobbin.jar
<br />
HelloBruce.jar
</div>
<br />
当你把这两个jar发布到App Server上以后，会创建两个EJB Class Loader的实例，分别去load这两个EJB包，比如说：
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">CLEJB_Robbin是load&nbsp;HelloRobbin.jar的<br />
CLEJB_Bruce是load&nbsp;HelloBruce.jar的 <br />
<br />
</span></div>
那么CLEJB_Robbin的load范围就仅仅限于HelloRobbin.jar之内，它load不到HelloRobbin.jar之外的任何文件，当然它也load不到HelloBruce.jar。
<br />
<br />
说到这里，<span style="color: red;"><strong>我相信大家应该已经明白为什么EJB规范不允许EJB有IO操作了吧？因为EJB Class Loader根本找不到jar包之外的文件</strong></span><strong></strong>！！！
<br />
（＃me:这里是我疑问最大的地方，也是测试验证的地方＃）<br />
<br />
如果现在你想实现HelloRobbin.jar和HelloBruce.jar的<span style="background-color: rgb(239, 255, 120);">互相调用</span>，那么该怎么办？他们<span style="background-color: rgb(239, 255, 120);">使用了不同的EJB Class Loader，相互之间是找不到对方的</span>。解<span style="background-color: rgb(239, 255, 120);">决办法就是使用EAR</span>。
<br />
<br />
现在假设HelloRobbin.jar和HelloBruce.jar都使用了Hibernate，看看该怎么打包和发布：
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">HelloEJB.ear<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;HelloRobbin.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;HelloBruce.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;Hibernate2.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;pojo.jar&nbsp;(定义所有的持久对象和hbm文件的jar包)<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;cglib</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">asm.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;commons</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">beanutils.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;commons</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">collections.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;commons</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">lang.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;commons</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">logging.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;dom4j.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;odmg.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;log4j.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;jcs.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;hibernate.properties<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;log4j.properties<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;cache.ccf<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;META</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">INF</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">application.xml&nbsp;(J2EE规范的要求，定义EAR包里面包括了哪几个EJB)</span></div>
<br />
<br />
除此之外，按照EJB规范要求，HelloRobbin.jar和HelloBruce.jar还必须指出调用jar包之外的类库的名称，这需要在jar包的manifest文件中定义：
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">HelloRobbin.jar<br />
</span><span style="color: rgb(0, 0, 0);">|------</span><span style="color: rgb(0, 0, 0);">&nbsp;META</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">INF</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">MANIFEST.MF <br />
</span></div>
<br />
MANIFEST.MF中必须包括如下一行：
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">Class</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">Path:&nbsp;log4j.jar&nbsp;hibernate2.jar&nbsp;cglib</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">asm.jar&nbsp;commons</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">beanutils.jar&nbsp;commons</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">collections.jar&nbsp;commons</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">lang.jar<br />
commons</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">logging.jar&nbsp;dom4j.jar&nbsp;jcs.jar&nbsp;odmg.jar&nbsp;jcs.jar&nbsp;pojo.jar <br />
</span></div>
<br />
这样就OK了，当把HelloEJB.ear发布到App Server上以后，App Server创建一个EJB Class
Loader实例load
EAR包里面的EJB，再根据EJB的jar包里面的MANIFEST.MF指出的Class-Path去寻找相应的jar包之外的类库。
<br />
<br />
所以一个EAR包有点类似一个Web Application，EJB Class
Loader的load范围也就是EAR范围之内，它load不到EAR之外的文件。除非把Hibernate定义到CLASSPATH指定的路径下，在
这种情况下，EJB Class Loader找不到Hibernate，只能交给上一级的Class Loader，最后由App Class
Loader找到Hibernate，进行初始化。
<br />
<br />
没有写完，继续说...
<br />
<br />
由于EAR这样load Class规则，假设Robbin和Bruce都在同一个Weblogic上运行自己的网站，而我们都不希望自己的程序里面的Hibernate配置被对方的搞乱掉，那么我们就可以这样来做：
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">Robbin</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">s&nbsp;Website:</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 0);"><br />
Robbin.ear<br />
</span><span style="color: rgb(0, 0, 0);">|--------</span><span style="color: rgb(0, 0, 0);">&nbsp;robbin.war&nbsp;(把Web&nbsp;Application打包)<br />
</span><span style="color: rgb(0, 0, 0);">|--------</span><span style="color: rgb(0, 0, 0);">&nbsp;robbin.jar&nbsp;(把开发的EJB打包）<br />
</span><span style="color: rgb(0, 0, 0);">|--------</span><span style="color: rgb(0, 0, 0);">&nbsp;Hibernate2.jar<br />
<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" />..<br />
</span><span style="color: rgb(0, 0, 0);">|--------</span><span style="color: rgb(0, 0, 0);">&nbsp;META</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">INF</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">application.xml</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 0);"><br />
<br />
Bruce</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">s&nbsp;Website:</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 0);"><br />
Bruce.ear<br />
</span><span style="color: rgb(0, 0, 0);">|--------</span><span style="color: rgb(0, 0, 0);">&nbsp;bruce.war&nbsp;(把Web&nbsp;Application打包)<br />
</span><span style="color: rgb(0, 0, 0);">|--------</span><span style="color: rgb(0, 0, 0);">&nbsp;bruce.jar&nbsp;(把开发的EJB打包）<br />
</span><span style="color: rgb(0, 0, 0);">|--------</span><span style="color: rgb(0, 0, 0);">&nbsp;Hibernate2.jar<br />
<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" />..<br />
</span><span style="color: rgb(0, 0, 0);">|--------</span><span style="color: rgb(0, 0, 0);">&nbsp;META</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">INF</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">application.xml <br />
</span></div>
<br />
这样在同一个App Server上运行，就可以互相不干扰。<br />
<br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
至此，这个是引文，外加了部分个人的解释。<br />
其中针对如下的话：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">我相信大家应该已经明白为什么EJB规范不允许EJB有IO操作了吧？因为EJB&nbsp;Class&nbsp;Loader根本找不到jar包之外的文件</span></div>
我感觉很疑惑，同时EJB规范似乎有大概如下描述：<br />
EJB模型不推荐或者禁止在EJB组件中读取文件....<br />
<br />
为什么不允许读取文件呢？是否真的找不到呢？<br />
我采用了两种方式：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">(方式一)<br />
${Class_Name}.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">.getClassLoader().getResourceAsStream(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${file}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
file路径方式：<br />
一种方式采用直接的绝对路径<br />
一种方式采用相对于ear包的／jar包内<br />
<br />
（方式二）<br />
</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;File(${file})<br />
file路径采用绝对路径</span></div>
结果得到如下结论：<br />
方式一 如果采用getResourceAsStream的方式，无法访问ear包之外的资源<br />
方式一采用绝对路径的文件方式，貌似返回是null（记录有点模糊了）<br />
方式二采用绝对路径，绝对没有问题<br />
<br />
我现在想，并不是真的不能访问外部资源，而是其设计就是为了把classloaser的界限限制在jar包内或者ear内，而不相互干扰，因而在其规范中就是禁止或者不推荐读取文件的方式了。<br />
<img src ="http://www.blogjava.net/crazycy/aggbug/188822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2008-03-26 18:19 <a href="http://www.blogjava.net/crazycy/archive/2008/03/26/188822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassLoader专题（四）：部署ear包出错引发的ClassLoader的思考</title><link>http://www.blogjava.net/crazycy/archive/2008/03/18/187056.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Tue, 18 Mar 2008 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2008/03/18/187056.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/187056.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2008/03/18/187056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/187056.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/187056.html</trackback:ping><description><![CDATA[<a id="CategoryEntryList1_EntryStoryList_Entries_ctl06_TitleUrl" class="entrylisttitle" href="../../crazycy/archive/2007/02/01/97350.html">ClassLoader专题（一）：ClassLoader基础</a><br />
<a id="CategoryEntryList1_EntryStoryList_Entries_ctl09_TitleUrl" class="entrylisttitle" href="../../crazycy/archive/2006/11/24/83379.html">ClassLoader专题（二）：从Servlet容器看ClassLoader机制的妙用</a><br />
<a id="CategoryEntryList1_EntryStoryList_Entries_ctl03_TitleUrl" class="entrylisttitle" href="../../crazycy/archive/2007/05/05/115383.html">ClassLoader专题（三）：引文</a><br />
<a id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl01_TitleUrl" href="../../crazycy/archive/2008/03/18/187056.html">ClassLoader专题（四）：</a><a href="http://cuiyi.javaeye.com/admin/blogs/173561">部署ear包出错引发的ClassLoader的思考</a><br />
<br />
应用服务器常常包含多个容器，当前使用的是JBoss，在<strong>部署ear包</strong>的时候，遇到了一些比较有意思的问题，遂随着不断的推敲，从而解决了问题，也对classloader在应用服务器如JBoss中有了一点的推测（不当之处请光顾的朋友指出）。<br />
测试环境：JBoss4.0.5.GA 、Gentoo Linux、 spring、ejb（<strong>ear工程</strong>）<br />
<br />
1）使用ant打包脚本的疏忽，把struts action的class同时放在了${ear_file}/${jar_file} 和${ear_file}/${war_file}/WEB-INF/{lib}/${jar_file}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 纠正之后，再次修改了struts action的实现类，后者确实不断地更新，但是始终未被执行，而执行的总是前者<br />
<br />
2）ant打包，把${xml_config_file}放在了${ear_file}/${jar_file} 和${ear_file}/${war_file}/WEB-INF/classes/${xml_config_file}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 之后做了如下的测试：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21）前者不变，更新后者，结果：取新增加的物件出错<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 22）移除前者，更新后者，结果：可以取到新增加的物件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23）保持前者，新物件的配置作为一个新的文件，同时也放在后者的位置，结果：可以取到新增加的物件。<br />
<br />
3）通过IoC注入配置文件的位置，然后读取配置文件的内容(未使用Spring的解析方法，而是自己实现解析)：<br />
&nbsp; 注入xml位置的配置如下（粗体处）：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">test.DataMigrateCenter</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">demo.service.DataMigrateCenter</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">dataExtractDao</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">ref&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">demo.dataExtractDao</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">markExtractedDao</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">ref&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">demo.markExtractedDao</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">errorsPath</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/home/cuiyi/demo/Errors/</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">invoicesPath</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/home/cuiyi/demo/Invoices/</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">archivesPath</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/home/cuiyi/demo/Archives/</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sqlPath</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">x.war/WEB-INF/classes/xyz_sql.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span></strong><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span></div>
<br />
<span style="color: #000000;">xyz_sql.xml的真实位置在</span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">-</span><span style="color: #000000;">4.0</span><span style="color: #000000;">.</span><span style="color: #000000;">5</span><span style="color: #000000;">.GA</span><span style="color: #000000;">/</span><span style="color: #000000;">server</span><span style="color: #000000;">/</span><span style="color: #000000;">xyz</span><span style="color: #000000;">/</span><span style="color: #000000;">deploy</span><span style="color: #000000;">/</span><span style="color: #000000;">x.ear</span><span style="color: #000000;">/</span><span style="color: #000000;">x.war</span><span style="color: #000000;">/</span><span style="color: #000000;">WEB</span><span style="color: #000000;">-</span><span style="color: #000000;">INF</span><span style="color: #000000;">/</span><span style="color: #000000;">classes</span><span style="color: #000000;">/xyz</span><span style="color: #000000;">_sql.xml<br />
<br />
</span>
注入了sqlPath后，交给了一个工具类来解析，这个工具类放在表现层，即打包到war里，代码类似如下<br />
<br />
<strong></strong>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Document&nbsp;getRootDocument(String&nbsp;fileName)&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;DocumentException{//</span>参数fileName即注入的<strong><span style="color: #000000;">sqlPath</span></strong><br />
<span style="color: #000000;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXReader&nbsp;reader&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SAXReader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Print Code<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;in&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResourceAsStream(fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;document&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;reader.read(in);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;document;<br />
}</span></div>
<br />
在getRootDocument方法的Print Code处，增加如下打印语句：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">""</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/test.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/../test.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">../test.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(Thread.currentThread().getContextClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(Thread.currentThread().getContextClassLoader().getResource(</span><span style="color: #000000;">""</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClass().getClassLoader().getResource(</span><span style="color: #000000;">""</span><span style="color: #000000;">));</span></div>
其中，使用的test.xml实际上并不存在；<br />
得到的输出结果（外加了打印语句的本身描述）<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">47</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">213</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">47</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">214</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">""</span><span style="color: #000000;">)&nbsp;:&nbsp;file:</span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">-</span><span style="color: #000000;">4.0</span><span style="color: #000000;">.</span><span style="color: #000000;">5</span><span style="color: #000000;">.GA</span><span style="color: #000000;">/</span><span style="color: #000000;">server</span><span style="color: #000000;">/</span><span style="color: #000000;">xyz</span><span style="color: #000000;">/</span><span style="color: #000000;">deploy</span><span style="color: #000000;">/</span><span style="color: #000000;">x.ear</span><span style="color: #000000;">/</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">47</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">222</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/test.xml"</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">47</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">231</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/../test.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">47</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">241</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource("</span><span style="color: #000000;">../test.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">47</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">241</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;Thread.currentThread().getContextClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">):</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">47</span><span style="color: #000000;">:</span><span style="color: #000000;">18</span><span style="color: #000000;">,</span><span style="color: #000000;">242</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;Thread.currentThread().getContextClassLoader().getResource(</span><span style="color: #000000;">""</span><span style="color: #000000;">):</span><span style="color: #000000;"><span style="color: #3518ff;"><span style="color: #000000;">file:</span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">-</span><span style="color: #000000;">4.0</span><span style="color: #000000;">.</span><span style="color: #000000;">5</span><span style="color: #000000;">.GA</span><span style="color: #000000;">/</span><span style="color: #000000;">server</span><span style="color: #000000;">/</span><span style="color: #000000;">xyz</span><span style="color: #000000;">/</span><span style="color: #000000;">deploy</span><span style="color: #000000;">/</span><span style="color: #000000;">x.ear</span><span style="color: #000000;">/<br />
</span></span></span>执行到<span style="color: #000000;">System.out.println(Thread.currentThread().getContextClassLoader().getResource(</span><span style="color: #000000;">""</span><span style="color: #000000;">)); 出错</span><br />
</div>
将test.xml换成一个真实存在的文件 test.jar<br />
并在getRootDocument方法的Print Code处，增加如下打印语句：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">""</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span>test<span style="color: #000000;">.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/../test.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">../test.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">test.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(Thread.currentThread().getContextClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
System.out.println(Thread.currentThread().getContextClassLoader().getResource(</span><span style="color: #000000;">""</span><span style="color: #000000;">));<br />
System.out.println(SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(fileName));</span></div>
得到的输出结果（外加了打印语句的本身描述）
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">57</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">882</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource("</span><span style="color: #000000;">/"</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">57</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">900</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(""</span><span style="color: #000000;">)&nbsp;:&nbsp;file:</span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">-</span><span style="color: #000000;">4.0</span><span style="color: #000000;">.</span><span style="color: #000000;">5</span><span style="color: #000000;">.GA</span><span style="color: #000000;">/</span><span style="color: #000000;">server</span><span style="color: #000000;">/</span><span style="color: #000000;">xyz</span><span style="color: #000000;">/</span><span style="color: #000000;">deploy</span><span style="color: #000000;">/</span><span style="color: #000000;">x.ear</span><span style="color: #000000;">/</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">57</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">909</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource("</span><span style="color: #000000;">/test.jar"</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">57</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">918</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/../test.jar"</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">57</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">926</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource("</span><span style="color: #000000;">../test.jar"</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">57</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">926</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">test.jar"</span><span style="color: #000000;">)&nbsp;:&nbsp;file:</span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">-</span><span style="color: #000000;">4.0</span><span style="color: #000000;">.</span><span style="color: #000000;">5</span><span style="color: #000000;">.GA</span><span style="color: #000000;">/</span><span style="color: #000000;">server</span><span style="color: #000000;">/</span><span style="color: #000000;">xyz</span><span style="color: #000000;">/</span><span style="color: #000000;">deploy</span><span style="color: #000000;">/</span><span style="color: #000000;">x.ear</span><span style="color: #000000;">/</span><span style="color: #000000;">test.jar<br />
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">57</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">927</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;Thread.currentThread().getContextClassLoader().getResource(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">):</span><span style="color: #0000ff;">null<br />
</span><span style="color: #000000;">
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">57</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">927</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]</span><span style="color: #000000;">-------&gt;&gt;&gt;&gt;&gt;&gt;&gt;Thread.currentThread().getContextClassLoader().getResource(</span><span style="color: #000000;">""</span><span style="color: #000000;">):</span><span style="color: #000000;">file:</span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">-</span><span style="color: #000000;">4.0</span><span style="color: #000000;">.</span><span style="color: #000000;">5</span><span style="color: #000000;">.GA</span><span style="color: #000000;">/</span><span style="color: #000000;">server</span><span style="color: #000000;">/xyz</span><span style="color: #000000;">/</span><span style="color: #000000;">deploy</span><span style="color: #000000;">/</span><span style="color: #000000;">x.ear</span><span style="color: #000000;">/<br />
</span><span style="color: #000000;">
</span><span style="color: #000000;">17</span><span style="color: #000000;">:</span><span style="color: #000000;">57</span><span style="color: #000000;">:</span><span style="color: #000000;">16</span><span style="color: #000000;">,</span><span style="color: #000000;">927</span><span style="color: #000000;">&nbsp;INFO&nbsp;&nbsp;[STDOUT]&nbsp;</span><span style="color: #000000;">--------&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;">SqlReaderHelper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.getClassLoader().getResource("</span><span style="color: #000000;">fileName</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;:&nbsp;file:</span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">/</span><span style="color: #000000;">jboss</span><span style="color: #000000;">-</span><span style="color: #000000;">4.0</span><span style="color: #000000;">.</span><span style="color: #000000;">5</span><span style="color: #000000;">.GA</span><span style="color: #000000;">/</span><span style="color: #000000;">server</span><span style="color: #000000;">/</span><span style="color: #000000;">xyz</span><span style="color: #000000;">/</span><span style="color: #000000;">deploy</span><span style="color: #000000;">/</span><span style="color: #000000;">x.ear</span><span style="color: #000000;">/</span><span style="color: #000000;">cxc3.war</span><span style="color: #000000;">/</span><span style="color: #000000;">WEB</span><span style="color: #000000;">-</span><span style="color: #000000;">INF</span><span style="color: #000000;">/</span><span style="color: #000000;">classes</span><span style="color: #000000;">/</span><span style="color: #000000;">cxc2sap_sql.xml</span></div>
<br />
<span style="color: #000000;"><br />
<span style="background-color: #ff2828;">
通过上述描述，可以简单的得出一些推论</span>：<br />
<span style="background-color: #5138ff;"><span style="background-color: #fefff0;"><span style="background-color: #b3ff90;">对1）2）</span></span></span><br />
在应用服务器如</span><span style="color: #000000;">JBoss</span><span style="color: #000000;">中，加载</span>${ear_file}/${jar_file}的EJB容器 和 加载${ear_file}/${war_file}的Web容器间存在一定的关系，根据ClassLoader的加载机制：当当前类加载器需要加载一个类的时候，首先请求父级的类加载器加载，如果父级加载器无法找到要加载的类（每个加载器仅仅在自己本身的classpath寻找要加载的类），才由当前类加载器来加载，如果加载不到就报错。<br />
根据这个，可认为EJB容器的ClassLoader起了Web容器的父级ClassLoader的作用，即：请求加载一个action class时，当前类加载器是web容器，但是web容器的ClassLoader委托其父级加载器来加载，结果其父亲加载并加载成功了，所以不再加载本来正确的${war_file}/WEB-INF/lib or ${war_file}/WEB-INF/classes下的真正的类了<br />
<br />
<span style="background-color: #b3ff90;">对3）</span><br />
这些输出信息则更充分的证明了当使用${Class_name}.class.getClassLoader()的时候，真正起作用的类加载器便是父级类加载器，即使EJB容器的ClassLoader，从而得到的当前classpath是${ear_file}的路径。<br />
<br />
<span style="background-color: #b3ff90;">回想过去经历：</span><br />
基于这些实验，记得曾经遇到这样的错误：把struts.jar也放在了${ear_file}之下，运行报错误。<br />
原因依然是类加载器的两个基本原理：<br />
1）加载的委托机制，见上面的分析<br />
2）当一个类被某一个ClassLoader加载后，与其相关的类都由同一个ClassLoader加载<br />
&nbsp;于是得出如下结论：EJB容器加载了struts.jar，当web容器的ClassLoader加载自己的action class的实现类的时候，需要Action基类，但是根据默认的加载原理，关联的类应该由同一个类加载器完成，现在Action基类被父级的加载器加载（相对于当前），Action的实现类在当前的类加载器，故此发生错误。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/crazycy/aggbug/187056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2008-03-18 18:08 <a href="http://www.blogjava.net/crazycy/archive/2008/03/18/187056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用属性(Property)有空格的properties文件</title><link>http://www.blogjava.net/crazycy/archive/2007/12/02/164648.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Sun, 02 Dec 2007 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2007/12/02/164648.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/164648.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2007/12/02/164648.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/164648.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/164648.html</trackback:ping><description><![CDATA[<p>一、程序</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_154847" onclick="this.style.display='none'; Code_Closed_Text_154847.style.display='none'; Code_Open_Image_154847.style.display='inline'; Code_Open_Text_154847.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_154847" style="display: none" onclick="this.style.display='none'; Code_Open_Text_154847.style.display='none'; Code_Closed_Image_154847.style.display='inline'; Code_Closed_Text_154847.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_154847" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">代码</span><span id="Code_Open_Text_154847" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_25_497_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_497_Open_Text.style.display='none'; Codehighlighter1_25_497_Closed_Image.style.display='inline'; Codehighlighter1_25_497_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_25_497_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_497_Closed_Text.style.display='none'; Codehighlighter1_25_497_Open_Image.style.display='inline'; Codehighlighter1_25_497_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PropsReader&nbsp;</span><span id="Codehighlighter1_25_497_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_25_497_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_86_495_Open_Image" onclick="this.style.display='none'; Codehighlighter1_86_495_Open_Text.style.display='none'; Codehighlighter1_86_495_Closed_Image.style.display='inline'; Codehighlighter1_86_495_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_86_495_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_86_495_Closed_Text.style.display='none'; Codehighlighter1_86_495_Open_Image.style.display='inline'; Codehighlighter1_86_495_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException&nbsp;</span><span id="Codehighlighter1_86_495_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_86_495_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Properties&nbsp;props&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Properties();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream&nbsp;inStream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PropsReader.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getResourceAsStream(</span><span style="color: #000000">"</span><span style="color: #000000">payterm.properties</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.load(inStream);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enumeration&nbsp;enums&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;props.propertyNames();<br />
<img id="Codehighlighter1_316_492_Open_Image" onclick="this.style.display='none'; Codehighlighter1_316_492_Open_Text.style.display='none'; Codehighlighter1_316_492_Closed_Image.style.display='inline'; Codehighlighter1_316_492_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_316_492_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_316_492_Closed_Text.style.display='none'; Codehighlighter1_316_492_Open_Image.style.display='inline'; Codehighlighter1_316_492_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(enums.hasMoreElements())&nbsp;</span><span id="Codehighlighter1_316_492_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_316_492_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;key&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)enums.nextElement();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Property---&gt;&gt;&gt;&gt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;key<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Value---&gt;&gt;&gt;&gt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;props.getProperty(key));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></span></div>
<br />
二、属性文件<br />
文件一<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">PAYMENT&nbsp;AFTER&nbsp;DELIVERY</span><span style="color: #000000">=</span><span style="color: #000000">PAYMENT&nbsp;AFTER&nbsp;DELIVERY<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />PAYMENT&nbsp;BEFORE&nbsp;COLLECTION</span><span style="color: #000000">=</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;COLLECTION<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />PAYMENT&nbsp;BEFORE&nbsp;COLLECTION</span><span style="color: #000000">-</span><span style="color: #000000">SHELL</span><span style="color: #000000">=</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;COLLECTION<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />PAYMENT&nbsp;BEFORE&nbsp;DELIVERY</span><span style="color: #000000">=</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;DELIVERY</span></div>
<br />
文件二<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_155314" onclick="this.style.display='none'; Code_Closed_Text_155314.style.display='none'; Code_Open_Image_155314.style.display='inline'; Code_Open_Text_155314.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_155314" style="display: none" onclick="this.style.display='none'; Code_Open_Text_155314.style.display='none'; Code_Closed_Image_155314.style.display='inline'; Code_Closed_Text_155314.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_155314" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">property file with blank in key part</span><span id="Code_Open_Text_155314" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">PAYMENT\&nbsp;AFTER\&nbsp;DELIVERY</span><span style="color: #000000">=</span><span style="color: #000000">PAYMENT&nbsp;AFTER&nbsp;DELIVERY<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />PAYMENT\&nbsp;BEFORE\&nbsp;COLLECTION</span><span style="color: #000000">=</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;COLLECTION<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />PAYMENT\&nbsp;BEFORE\&nbsp;COLLECTION</span><span style="color: #000000">-</span><span style="color: #000000">SHELL</span><span style="color: #000000">=</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;COLLECTION<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />PAYMENT\&nbsp;BEFORE\&nbsp;DELIVERY</span><span style="color: #000000">=</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;DELIVERY</span></span></div>
<br />
三、输出<br />
文件一的输出<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Property</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">PAYMENT&nbsp;&nbsp;&nbsp;&nbsp;Value</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">BEFORE&nbsp;DELIVERY</span><span style="color: #000000">=</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;DELIVERY</span></div>
<br />
文件二的输出<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_155548" onclick="this.style.display='none'; Code_Closed_Text_155548.style.display='none'; Code_Open_Image_155548.style.display='inline'; Code_Open_Text_155548.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_155548" style="display: none" onclick="this.style.display='none'; Code_Open_Text_155548.style.display='none'; Code_Closed_Image_155548.style.display='inline'; Code_Closed_Text_155548.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_155548" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">output of key having blank</span><span id="Code_Open_Text_155548" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Property</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;COLLECTION</span><span style="color: #000000">-</span><span style="color: #000000">SHELL&nbsp;&nbsp;&nbsp;&nbsp;Value</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;COL<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />LECTION<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Property</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">PAYMENT&nbsp;AFTER&nbsp;DELIVERY&nbsp;&nbsp;&nbsp;&nbsp;Value</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">PAYMENT&nbsp;AFTER&nbsp;DELIVERY<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Property</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;COLLECTION&nbsp;&nbsp;&nbsp;&nbsp;Value</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;COLLECTIO<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />N<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Property</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;DELIVERY&nbsp;&nbsp;&nbsp;&nbsp;Value</span><span style="color: #000000">---&gt;&gt;&gt;&gt;</span><span style="color: #000000">PAYMENT&nbsp;BEFORE&nbsp;DELIVERY</span></span></div>
<br />
四、结论<br />
弃用XML第一次启用属性文件，是一个月前，碍于进度，遂以Map代码中设置之；<br />
今看<a title="Properties Editor Plugin for Eclipse" href="http://propedit.sourceforge.jp/eclipse/updates/">Properties Editor Plugin for Eclipse</a>; <strong>获得颜色提示</strong> 突然获解；庆祝之记录之。 
<img src ="http://www.blogjava.net/crazycy/aggbug/164648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2007-12-02 16:00 <a href="http://www.blogjava.net/crazycy/archive/2007/12/02/164648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.util.List 真的会用么？看能作对否</title><link>http://www.blogjava.net/crazycy/archive/2007/09/14/145227.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Fri, 14 Sep 2007 11:55:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2007/09/14/145227.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/145227.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2007/09/14/145227.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/145227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/145227.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DynamicRemove&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;generateList()&nbsp;{<br />
&nbsp;&nbsp;String[]&nbsp;figures&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[]{</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">2</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">3</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">4</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">5</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">6</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">7</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">8</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">9</span><span style="color: #000000;">"</span><span style="color: #000000;">};<br />
&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(String&nbsp;figure&nbsp;:&nbsp;figures)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(figure);<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;list;<br />
}<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test1()&nbsp;{<br />
&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;loads&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;generateList();&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;loads&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">loads.isEmpty())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(String&nbsp;load&nbsp;:&nbsp;loads)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(load);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(Integer.valueOf(load).intValue()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">3</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loads.remove(load);&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(</span><span style="color: #000000;">"</span><span style="color: #000000;">====</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;loads.get(</span><span style="color: #000000;">2</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">size</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;loads.size());&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;DynamicRemove&nbsp;test&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DynamicRemove();<br />
&nbsp;&nbsp;test.test1();<br />
}<br />
<br />
输出为：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_195220" onclick="this.style.display='none'; Code_Closed_Text_195220.style.display='none'; Code_Open_Image_195220.style.display='inline'; Code_Open_Text_195220.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" height="16" width="11" /><img id="Code_Open_Image_195220" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_195220.style.display='none'; Code_Closed_Image_195220.style.display='inline'; Code_Closed_Text_195220.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" height="16" width="11" /><span id="Code_Closed_Text_195220" style="border: 1px solid #808080; background-color: #ffffff;">你答对了么</span><span id="Code_Open_Text_195220" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">[WARN&nbsp;]&nbsp;Not&nbsp;using&nbsp;NPTL&nbsp;on&nbsp;a&nbsp;</span><span style="color: #000000;">2.6</span><span style="color: #000000;">&nbsp;kernel.&nbsp;This&nbsp;configuration&nbsp;is&nbsp;not&nbsp;supported.<br />
Exception&nbsp;in&nbsp;thread&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Main&nbsp;Thread</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;java.util.ConcurrentModificationException<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.util.AbstractList$Itr.checkForComodification(AbstractList.java:</span><span style="color: #000000;">449</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.util.AbstractList$Itr.next(AbstractList.java:</span><span style="color: #000000;">420</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;dynamicrmobjwhilelisting.DynamicRemove.test1(DynamicRemove.java:</span><span style="color: #000000;">17</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;dynamicrmobjwhilelisting.DynamicRemove.main(DynamicRemove.java:</span><span style="color: #000000;">35</span><span style="color: #000000;">)<br />
</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">2</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">====</span><span style="color: #000000;">4</span></span></div>
<br />
这样呢？<span style="color: #000000;"> <br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_195555" onclick="this.style.display='none'; Code_Closed_Text_195555.style.display='none'; Code_Open_Image_195555.style.display='inline'; Code_Open_Text_195555.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" height="16" width="11" /><img id="Code_Open_Image_195555" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_195555.style.display='none'; Code_Closed_Image_195555.style.display='inline'; Code_Closed_Text_195555.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" height="16" width="11" /><span id="Code_Closed_Text_195555" style="border: 1px solid #808080; background-color: #ffffff;">嘿嘿，是这样么</span><span id="Code_Open_Text_195555" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test2()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;loads&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;generateList();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;loads&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">loads.isEmpty())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;loads.size()&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">--</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(loads.get(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(Integer.valueOf(loads.get(i).toString()).intValue()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loads.remove(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">====</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;loads.get(</span><span style="color: #000000;">2</span><span style="color: #000000;">));<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">size</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;loads.size());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
输出呢？<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_195831" onclick="this.style.display='none'; Code_Closed_Text_195831.style.display='none'; Code_Open_Image_195831.style.display='inline'; Code_Open_Text_195831.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11"  alt="" /><img id="Code_Open_Image_195831" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_195831.style.display='none'; Code_Closed_Image_195831.style.display='inline'; Code_Closed_Text_195831.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"  alt="" /><span id="Code_Closed_Text_195831" style="border: 1px solid #808080; background-color: #ffffff;">答案</span><span id="Code_Open_Text_195831" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">9</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">8</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">7</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">6</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">5</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">4</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">====</span><span style="color: #000000;">4</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">2</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
size8</span></span></div>
<br />
<br />
</div>
<img src ="http://www.blogjava.net/crazycy/aggbug/145227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2007-09-14 19:55 <a href="http://www.blogjava.net/crazycy/archive/2007/09/14/145227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassLoader专题（三）：引文</title><link>http://www.blogjava.net/crazycy/archive/2007/05/05/115383.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Fri, 04 May 2007 18:03:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2007/05/05/115383.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/115383.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2007/05/05/115383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/115383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/115383.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ClassLoader 专题（一）： ClassLoader 基础 ClassLoader 专题（二）：从 Servlet 容器看 ClassLoader 机制的妙用 &nbsp;&nbsp;&nbsp; ClassLoader专题（三）：引文 &nbsp;Find a way out of the ClassLoader mazeSystem, current, context?...&nbsp;&nbsp;<a href='http://www.blogjava.net/crazycy/archive/2007/05/05/115383.html'>阅读全文</a><img src ="http://www.blogjava.net/crazycy/aggbug/115383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2007-05-05 02:03 <a href="http://www.blogjava.net/crazycy/archive/2007/05/05/115383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程vs进程---求职笔记（5）</title><link>http://www.blogjava.net/crazycy/archive/2007/02/05/97997.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Mon, 05 Feb 2007 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2007/02/05/97997.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/97997.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2007/02/05/97997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/97997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/97997.html</trackback:ping><description><![CDATA[
		<br />
		<font style="BACKGROUND-COLOR: #ffa500">第一局<br /></font>[进程]<br />是程序的一次执行，<br />是资源分配的单位[即抢占CPU的调度单位]，所有与该进程相关的资源（打印机、内存）都被登记在PCB中，<br />拥有完整的虚拟地址空间<br /><br />[线程]<br />它属于一个进程<br />与资源分配无关<br />与进程内的其它线程一起共享该进程的资源<br /><br /><font style="BACKGROUND-COLOR: #ffff00">第二局<br /></font>[调度]<br />进程调度时，不同进程拥有不同虚地址空间；<br />同一进程内的不同线程共享同一地址空间<br /><br /><font style="BACKGROUND-COLOR: #ffa500">第三局</font><br />[切换]<br />进程切换时，涉及资源指针的保存和地址空间的变化等问题（即切换进程上下文）<br />线程切换时，不涉及资源信息的保存和地址空间的变化等问题，减少了系统的开销<img src ="http://www.blogjava.net/crazycy/aggbug/97997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2007-02-05 14:34 <a href="http://www.blogjava.net/crazycy/archive/2007/02/05/97997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多态(overridding)的分析---求职笔记（3） </title><link>http://www.blogjava.net/crazycy/archive/2007/02/05/97903.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Sun, 04 Feb 2007 16:36:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2007/02/05/97903.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/97903.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2007/02/05/97903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/97903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/97903.html</trackback:ping><description><![CDATA[
		<p>上篇： <a id="viewpost1_TitleUrl" href="/crazycy/archive/2006/10/11/74622.html"><font color="#000080">JAVA基础(一)：多态(overloading &amp; overridding)的分析</font></a><br /><br />本篇只是强化和复习：<br /><br />1 多态只针对非final方法；<br /> 不针对变量、final方法<br /><br />2方法[非final]是运行时对应对象<br /> 变量、fianl是编译期间对应对象<br /><br />3多态只能调用父类中有的方法(向上扩展后)<br /> 不能调用父类中没有的方法；<br /> 不能调用子类中扩展父类[not overridding]方法<br /> <br />4多态定义：指的是使用同一个实现接口，以实现不同的对象实例<br /> 多态好处：多态让程序依赖接口或者抽象类，而不是具体类</p>
<img src ="http://www.blogjava.net/crazycy/aggbug/97903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2007-02-05 00:36 <a href="http://www.blogjava.net/crazycy/archive/2007/02/05/97903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassLoader专题（一）：ClassLoader基础</title><link>http://www.blogjava.net/crazycy/archive/2007/02/01/97350.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Thu, 01 Feb 2007 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2007/02/01/97350.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/97350.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2007/02/01/97350.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/97350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/97350.html</trackback:ping><description><![CDATA[<strong><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"><a href="http://www.blogjava.net/crazycy/archive/2007/02/01/97350.html"><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">ClassLoader</span><font color=#000080> <span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; text-underline: none; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>专题（一）：</span> </span><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">ClassLoader</span> </font><span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; text-underline: none; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>基础</span> </span></a><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"><a href="http://www.blogjava.net/crazycy/archive/2006/11/24/83379.html"><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">ClassLoader</span><font color=#000080> <span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; text-underline: none; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>专题（二）：从</span> </span><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">Servlet</span> <span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; text-underline: none; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>容器看</span> </span><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">ClassLoader</span> </font><span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; text-underline: none; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>机制的妙用</span> </span></a></span></strong><br>&nbsp;&nbsp;&nbsp; <a id=AjaxHolder_PostComment_ctl06_RelativePostsList_ctl01_Hyperlink1 href="http://www.blogjava.net/crazycy/archive/2007/05/05/115383.html"><font color=#000080><strong>ClassLoader专题（三）：引文</strong></font></a>&nbsp;</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"><a href="http://www.blogjava.net/crazycy/archive/2006/11/24/83379.html"><span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; text-underline: none; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-theme-font: minor-fareast"> </span></a></span></strong></p>
<p>&#160;</p>
<p>JVM启动，会形成3个类加载器组成的初始化加载器层次结构：<br>bootstap classloader （加载核心类） <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br>extension classloader（加载ext(目录)，即java.ext.dirs()）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br>system classloader&nbsp;&nbsp; （加载-classpath或者java.class.path或者CLASSPATH）</p>
<p><br>ClassLoader机制：<br>a）全盘负责：一个classloader加载一个class后，这个class所引用或者依赖的类也由这个classloader载入，除非显示的用另一个classloader载入<br>b）委托机制：先由父加载器加载，除非父加载器找不到时才从自己的类路径中去寻找<br>c）Cache机制：classloader采用缓存机制，即先查cache；若cache中保存了这个class就直接返回；若无，才从文件读取和转化为class并放入cache</p>
<p>&nbsp;</p>
<p>ClassLoader加载类顺序：<br>1）检查cache是否有该类：<br>&nbsp;&nbsp;&nbsp; 11）若有直接返回<br>&nbsp;&nbsp;&nbsp; 12）若无，请求父类加载<br>&nbsp;&nbsp;&nbsp; 　　　　121) 若无父,则从bootstap classloader加载<br>2）加载：<br>&nbsp;&nbsp;&nbsp; 21）寻找class文件（丛与此classloader相关的类路径中寻找）<br>&nbsp;&nbsp;&nbsp; 22）从文件载入class<br>&nbsp;&nbsp;&nbsp; 23）找不到则抛出ClassNotFoundeException<br>3）扩展：<br>&nbsp;&nbsp;&nbsp; 记载时即2），覆写findClass可以实现自己的载入策略<br>&nbsp;&nbsp;&nbsp; 记载时即2），覆写loadClass来实现自己的载入过程</p>
<p><br>如何实现运行时动态载入与更新<br>本质：只要动态改类搜索路径和清除classloader的cache已载入的class就ok<br>做法：<br>1）继承ClassLoader：覆写loadClass方法，动态寻找class文件<br>2）只要重新使用一个新的类搜索路径来new一个classloader就可以，这样既更新了类的搜索路径以便来载入新的class，也更新生成了一个空白的cache</p>
<p><br>classloader载入的方式<br>1）Pre-loading 预先载入，载入基础类<br>2）load-on-demand 按需求载入</p>
<p><br>JDK为啥有两个JRE？<br>JDK中jre是运行java本身的程序，如javac<br>ProgramFile（默认安装）中jre是运行用户编写的java程序</p>
<img src ="http://www.blogjava.net/crazycy/aggbug/97350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2007-02-01 20:48 <a href="http://www.blogjava.net/crazycy/archive/2007/02/01/97350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java基础(五)：Java同步机制之notify vs notifyAll </title><link>http://www.blogjava.net/crazycy/archive/2007/01/24/95799.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Wed, 24 Jan 2007 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2007/01/24/95799.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/95799.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2007/01/24/95799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/95799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/95799.html</trackback:ping><description><![CDATA[use the wait-and-notify mechanism to deal with synchronized accessing a resource<br /><br />wait-and-notify <strong>mechanism</strong>：<br />1 wait &amp; notify can <strong>never</strong> be <strong>out of</strong> synchronized block of the releated-object （wait和notify方法必须在与之<strong>对应的对象</strong>的同步块里调用）<br />2 wait can release &amp; get the lock <strong>automatically</strong><br /><br />the <strong>difference</strong> between notify and notifyAll<br />1 notify is wake the thread which invoke the wait-method<br />2 notifyAll is wake all the thread waiting for the lock released<br />3 why can form the thread invoking the wait-method and threads waiting for the lock released?<br />   we know, if a <strong>synchronized method</strong> is invoked, all the other synchronized methods belong to the object can not be invoked, so the invoking threads must be blocked, and waiting the method can be invoke, so they all waite for the lock released in the list of waiting queue.<br />   a <strong>synchronized class</strong> is the same;<br />   when the notify method occurs, the waiting one who invoked wait() be wake;<br />   when the notifyAll method occurs, the waiting queue choose the most prior one to wake, can be the one invoking wait(), also can be the ones waiting the lock released;<br /><br /><br />what we should be care?<br />if one waiting thread is waked, its waiting condition may not be satisfied. and in the right way, it should wait continuely.<br />how we assure this route?  <br />--just as follows came from &lt;Effective Java&gt; and &lt;Practical Java&gt;<br />the former: Never invoke wait outside a loop<br />  eg: <br />  
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img id="Codehighlighter1_18_136_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_136_Open_Text.style.display='none'; Codehighlighter1_18_136_Closed_Image.style.display='inline'; Codehighlighter1_18_136_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_18_136_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_18_136_Closed_Text.style.display='none'; Codehighlighter1_18_136_Open_Image.style.display='inline'; Codehighlighter1_18_136_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">(obj) </span><span id="Codehighlighter1_18_136_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id="Codehighlighter1_57_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_133_Open_Text.style.display='none'; Codehighlighter1_57_133_Closed_Image.style.display='inline'; Codehighlighter1_57_133_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_57_133_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_57_133_Closed_Text.style.display='none'; Codehighlighter1_57_133_Open_Image.style.display='inline'; Codehighlighter1_57_133_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">condition does not hold</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_57_133_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       wait(); <br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Perform action appropriate to condition</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">       }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> }</span></span></div><br />the later: Use spin locks to deal with wait and notifyAll<br /><img src ="http://www.blogjava.net/crazycy/aggbug/95799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2007-01-24 20:14 <a href="http://www.blogjava.net/crazycy/archive/2007/01/24/95799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java基础(五)：怎么对集合对象按某个规则排序 Comparable vs Comparator</title><link>http://www.blogjava.net/crazycy/archive/2006/12/22/81516.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Thu, 21 Dec 2006 18:00:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/12/22/81516.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/81516.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/12/22/81516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/81516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/81516.html</trackback:ping><description><![CDATA[对策: 集合中的对象应该实现Comparable接口,或者实现Comparator接口<br /><br />两者区别:<br /><br />1) Comparable接口只有一个方法 compareTo(obj:Object):int<br />   Comparator接口有两个方法:  <br />          compare(o1:Object, o2:Object):int; <br />          equals(obj:Object):boolean<br /><br />    用法：Collections.sort(obj:Collection)<br /><br />2) Comparable位于java.lang包<br />   Comparator位于java.util包<br /><br />3) Comparable做为更一般的接口,基本可实现与自己的特定比较<br /><br />    用法：Collections.sort(obj:Collection, new Compartor());<br /><br />    用法：Collections.sort(obj:Collection, new Compartor(public int compare(o1:Object, o2:Object)){return n:int});<br /><br />   Comparator更适合在没有实现Comparable的集合对象类中;更像封装的一种算法,将操作与算法分离,应该是装饰模式(Decorator Pattern)和访问者模式(Visitor   Pattern)的体现<br /><br /><br /><br />以下是引用<br /><hr /><p><font color="#000000" size="2">要实现排序功能,一般有两种途径,这里对基本类型不适用,基本类型一般有Arrays中的静态方法.</font></p><p><font color="#000000" size="2">1.对象本身实现Comparable接口,那么该类的实例就是可以排序的.<br />有关Comparable: </font><a href="http://blog.csdn.net/treeroot/archive/2004/09/09/99613.aspx"><font color="#000000" size="2">http://blog.csdn.net/treeroot/archive/2004/09/09/99613.aspx</font></a><br /><font color="#000000" size="2">只要实现了Comparable接口,就可以调用Collections的sort方法对集合中的元素排序.</font></p><p><font color="#000000" size="2">2.指定一个Comparator,也就是实现了Comparator的类的一个实例.<br />但是Java本身只提供了一个Comparator的实现,就是Collections.reverseOrder().<br />该方法返回的是一个已经实现了Comparable接口的反序.</font></p><p><font color="#000000" size="2">看一下Comparator的全部内容:</font></p><p><font color="#000000" size="2">public interface Comparator {<br />　　int compare(Object o1, Object o2);<br />　　boolean equals(Object obj);<br />} <br />定义了两个方法,其实我们一般都只需要实现compare方法就行了,因为类都是默认从Object继承<br />所以会使用Object的equals方法.<br />Comparator一般都作为一个匿名类出现,对于没有实现Comparable的对象的集合,排序的时候<br />需要指定一个Comparator.</font></p><p><font color="#000000" size="2">这里举例说明<br />对于实现了Comparable的类我们就用最简单的Integer<br />List list=new ArrayList();<br />list.add(new Integer(3));<br />list.add(new Integer(53));<br />list.add(new Integer(34));<br />Collections.sort(list);</font></p><p><font color="#000000" size="2">对于没有实现Comparable的,我们就用Object,按照hashCode大小来排序.<br />List list= new ArrayList();<br />list.add(new Object());<br />list.add(new Object());<br />list.add(new Object());<br />Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){<br />　　return (o1.hashCode()-o2.hashCode());<br />});</font></p><img src ="http://www.blogjava.net/crazycy/aggbug/81516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-12-22 02:00 <a href="http://www.blogjava.net/crazycy/archive/2006/12/22/81516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassLoader专题（二）：从Servlet容器看ClassLoader机制的妙用</title><link>http://www.blogjava.net/crazycy/archive/2006/11/24/83379.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Fri, 24 Nov 2006 14:20:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/11/24/83379.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/83379.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/11/24/83379.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/83379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/83379.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"><a href="http://www.blogjava.net/crazycy/archive/2007/02/01/97350.html"><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">ClassLoader</span> <span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; text-underline: none; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>专题（一）：</span> </span><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">ClassLoader</span> <span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; text-underline: none; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>基础</span> </span></a><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'"><a href="http://www.blogjava.net/crazycy/archive/2006/11/24/83379.html"><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">ClassLoader</span> <span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; text-underline: none; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>专题（二）：从</span> </span><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">Servlet</span> <span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; text-underline: none; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>容器看</span> </span><span style="COLOR: navy; TEXT-DECORATION: none; text-underline: none">ClassLoader</span> <span lang=EN-US style="COLOR: navy; FONT-FAMILY: 宋体; TEXT-DECORATION: none; mso-fareast-font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; text-underline: none; mso-fareast-theme-font: minor-fareast"><span lang=EN-US>机制的妙用</span> </span></a></span></strong><br>&nbsp;&nbsp;&nbsp; <a id=AjaxHolder_PostComment_ctl06_RelativePostsList_ctl01_Hyperlink1 href="http://www.blogjava.net/crazycy/archive/2007/05/05/115383.html"><font color=#000080><strong>ClassLoader专题（三）：引文</strong></font></a> </p>
<p>classloader有啥妙用（1）？<br>这个问题得从自定义的classloader身上说，那自定义classloader缘由是什么呢？<br>告诉你：大多是因为编译时无法预知运行时需要哪些类，特别是app server；因此自定义classloader，运行时指定路径，来加载这个路径下的class</p>
<p><br>特殊说明<br>特殊说明1：如果没有特殊指定，用户自定义的classloader都把system classloader作为它的父加载器<br>特殊说明2：jvm认为不同的classloade载入相同名字的class是不同的，即使从同一个class文件载入</p>
<p><br>classloader有啥妙用（2）？<br>看到特殊说明2，你或许就会感觉疑惑或者不爽；啥概念？<br>以servlet、ejb等容器来剖析这个问题：</p>
<p>将接口或者基类放入classpath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;---------system classloader<br>执行时，动态载入实现或者继承这些接口或者基类的子类；&lt;---------customized classloader<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br>用customized classloader载入类时，发现它有一个父类class（extends）；<br>但是在载入它时，jvm先加载父类class； 这个父类是system classloader能识别的； 根据&#8220;委托机制&#8221;它将由system classloader来加载；<br>然后customized classloader（实际是system classloader来加载）再载入这个class,创建一个实例，转型为父类；<br>jvm就使用system classloader再次载入父类class，然后将此实例转型为这个父类class；</p>
<p>这个过程加载了两个父类class，都是由system classloader载入；即同一个classloader载入同一个文件，造型不会由异常</p>
<p>web app server大概是这样工作的；这样载入了任何继承了servlet的class并正确运行它们，不管class是什么，都它们实例化为一个servlet class</p>
<img src ="http://www.blogjava.net/crazycy/aggbug/83379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-11-24 22:20 <a href="http://www.blogjava.net/crazycy/archive/2006/11/24/83379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>google笔试的败笔（大家来仁者见仁哦）</title><link>http://www.blogjava.net/crazycy/archive/2006/10/18/75851.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Wed, 18 Oct 2006 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/10/18/75851.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/75851.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/10/18/75851.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/75851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/75851.html</trackback:ping><description><![CDATA[
		<p>1 超级失败的1：说8点开始，考试时间100分钟 ，怎么算都是9：10交卷；9点一到匆匆交卷了，晚上躺床上才发现错也；<br /><br />2 超级失败的2：把自个的生日又记错了；<br /><br />3 怕怕的发现：发现mm还是超级可怕滴，眼睁睁看着一个骗局，哎，也得谨慎些以防上当受骗啊；</p>
		<p>题目如下：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">T(</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">)</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #008000">;</span>
				<span style="COLOR: #008000">T(1)=1;T(2)=2;T(n)=T(n-1)+T(n-2)+T(n-3);</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">用最优方式求T(n)</span>
				<span style="COLOR: #008000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />int T(int n) {<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />可以用最熟悉的语言写</span>
		</div>
		<p>
				<br />在考场的第一个做法</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img id="Codehighlighter1_15_195_Open_Image" onclick="this.style.display='none'; Codehighlighter1_15_195_Open_Text.style.display='none'; Codehighlighter1_15_195_Closed_Image.style.display='inline'; Codehighlighter1_15_195_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_15_195_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_15_195_Closed_Text.style.display='none'; Codehighlighter1_15_195_Open_Image.style.display='inline'; Codehighlighter1_15_195_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> T </span>
				<span id="Codehighlighter1_15_195_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_15_195_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 2</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_37_193_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_193_Open_Text.style.display='none'; Codehighlighter1_37_193_Closed_Image.style.display='inline'; Codehighlighter1_37_193_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_37_193_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_37_193_Closed_Text.style.display='none'; Codehighlighter1_37_193_Open_Image.style.display='inline'; Codehighlighter1_37_193_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> t(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> n)</span>
						<span id="Codehighlighter1_37_193_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_37_193_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 3</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_53_70_Open_Image" onclick="this.style.display='none'; Codehighlighter1_53_70_Open_Text.style.display='none'; Codehighlighter1_53_70_Closed_Image.style.display='inline'; Codehighlighter1_53_70_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_53_70_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_70_Closed_Text.style.display='none'; Codehighlighter1_53_70_Open_Image.style.display='inline'; Codehighlighter1_53_70_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (n </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_53_70_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_53_70_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 4</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080"> 5</span>
										<span style="COLOR: #000000">
												<img id="Codehighlighter1_89_106_Open_Image" onclick="this.style.display='none'; Codehighlighter1_89_106_Open_Text.style.display='none'; Codehighlighter1_89_106_Closed_Image.style.display='inline'; Codehighlighter1_89_106_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_89_106_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_106_Closed_Text.style.display='none'; Codehighlighter1_89_106_Open_Image.style.display='inline'; Codehighlighter1_89_106_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (n </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_89_106_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_89_106_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 6</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080"> 7</span>
										<span style="COLOR: #000000">
												<img id="Codehighlighter1_125_142_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_142_Open_Text.style.display='none'; Codehighlighter1_125_142_Closed_Image.style.display='inline'; Codehighlighter1_125_142_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_125_142_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_142_Closed_Text.style.display='none'; Codehighlighter1_125_142_Open_Image.style.display='inline'; Codehighlighter1_125_142_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (n </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">2</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_125_142_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_125_142_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 8</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">2</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080"> 9</span>
										<span style="COLOR: #000000">
												<img id="Codehighlighter1_149_189_Open_Image" onclick="this.style.display='none'; Codehighlighter1_149_189_Open_Text.style.display='none'; Codehighlighter1_149_189_Closed_Image.style.display='inline'; Codehighlighter1_149_189_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_149_189_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_149_189_Closed_Text.style.display='none'; Codehighlighter1_149_189_Open_Image.style.display='inline'; Codehighlighter1_149_189_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span id="Codehighlighter1_149_189_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_149_189_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">10</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> t(n</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">) </span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000"> t(n</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">2</span>
										<span style="COLOR: #000000">) </span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000"> t(n</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">3</span>
										<span style="COLOR: #000000">);<br /></span>
										<span style="COLOR: #008080">11</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> <br /></span>
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>当时发现时间够用，进行了公式推理，但未得出规律的真谛<br />每个都与T(3)可以直接发生关系，关系是2的幂次方，但最终没有得出公式<br />遂改进如下：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img id="Codehighlighter1_15_190_Open_Image" onclick="this.style.display='none'; Codehighlighter1_15_190_Open_Text.style.display='none'; Codehighlighter1_15_190_Closed_Image.style.display='inline'; Codehighlighter1_15_190_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_15_190_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_15_190_Closed_Text.style.display='none'; Codehighlighter1_15_190_Open_Image.style.display='inline'; Codehighlighter1_15_190_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> T </span>
				<span id="Codehighlighter1_15_190_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_15_190_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 2</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_37_188_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_188_Open_Text.style.display='none'; Codehighlighter1_37_188_Closed_Image.style.display='inline'; Codehighlighter1_37_188_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_37_188_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_37_188_Closed_Text.style.display='none'; Codehighlighter1_37_188_Open_Image.style.display='inline'; Codehighlighter1_37_188_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> t(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> n)</span>
						<span id="Codehighlighter1_37_188_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_37_188_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 3</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_53_70_Open_Image" onclick="this.style.display='none'; Codehighlighter1_53_70_Open_Text.style.display='none'; Codehighlighter1_53_70_Closed_Image.style.display='inline'; Codehighlighter1_53_70_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_53_70_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_70_Closed_Text.style.display='none'; Codehighlighter1_53_70_Open_Image.style.display='inline'; Codehighlighter1_53_70_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (n </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_53_70_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_53_70_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 4</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080"> 5</span>
										<span style="COLOR: #000000">
												<img id="Codehighlighter1_89_106_Open_Image" onclick="this.style.display='none'; Codehighlighter1_89_106_Open_Text.style.display='none'; Codehighlighter1_89_106_Closed_Image.style.display='inline'; Codehighlighter1_89_106_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_89_106_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_106_Closed_Text.style.display='none'; Codehighlighter1_89_106_Open_Image.style.display='inline'; Codehighlighter1_89_106_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (n </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_89_106_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_89_106_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 6</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080"> 7</span>
										<span style="COLOR: #000000">
												<img id="Codehighlighter1_125_142_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_142_Open_Text.style.display='none'; Codehighlighter1_125_142_Closed_Image.style.display='inline'; Codehighlighter1_125_142_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_125_142_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_142_Closed_Text.style.display='none'; Codehighlighter1_125_142_Open_Image.style.display='inline'; Codehighlighter1_125_142_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (n </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">2</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_125_142_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_125_142_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 8</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">2</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080"> 9</span>
										<span style="COLOR: #000000">
												<img id="Codehighlighter1_149_184_Open_Image" onclick="this.style.display='none'; Codehighlighter1_149_184_Open_Text.style.display='none'; Codehighlighter1_149_184_Closed_Image.style.display='inline'; Codehighlighter1_149_184_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_149_184_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_149_184_Closed_Text.style.display='none'; Codehighlighter1_149_184_Open_Image.style.display='inline'; Codehighlighter1_149_184_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000"> </span>
								<span id="Codehighlighter1_149_184_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_149_184_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">10</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">2</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000"> t(n</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">) </span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000"> t(n</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">3</span>
										<span style="COLOR: #000000">);<br /></span>
										<span style="COLOR: #008080">11</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
								</span>
								<span style="COLOR: #000000"> <br /></span>
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>晚上躺床上，怎么可能这样直接呢？<br />突然想到最起码的一点就是重复数的计算，应该进行保存；<br />如果正向逐个求然后保存，可行；<br />如果倒向如何保存，尚未想好<br />大家来仁者见仁一下哦（有更好的思路的请指点）<br />public class T {<br /> Map values = new HashMap();<br /> <br /> public int t(int n){<br />  int result = 0;<br />  if (n == 0) {<br />    result = 1;<br />  } else if (n == 1) {<br />   result = 1;<br />  } else if (n == 2) {<br />   result = 2;<br />  } else {<br />   result =  2 * t(n-1) - t(n-3);<br />  } <br />  return result;<br /> }<br />}<br /><br /></p>
<img src ="http://www.blogjava.net/crazycy/aggbug/75851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-10-18 11:37 <a href="http://www.blogjava.net/crazycy/archive/2006/10/18/75851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java基础(四)：Java同步机制</title><link>http://www.blogjava.net/crazycy/archive/2006/10/14/75085.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Fri, 13 Oct 2006 17:10:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/10/14/75085.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/75085.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/10/14/75085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/75085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/75085.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">方式有四种：①</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">ThreadLocal</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体"></span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">②</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">synchronized(</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">)</span> <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">③</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">wait() </span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">与</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">notify()</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体"></span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">④</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">volatile<br><br><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">目的：都是为了解决多线程中的对同一变量的访问冲突<br></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><br><font style="BACKGROUND-COLOR: #a52a2a">ThreadLocal</font> <br>&nbsp;&nbsp;&nbsp; .</span> <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">㈠</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">ThreadLocal</span> <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">保证不同线程拥有不同实例，相同线程一定拥有相同的实例，即为每一个使用该变量的线程提供一个该变量值的副本，每一个线程都可以独立改变自己的副本，而不是与其它线程的副本冲突。</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">.</span> <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">㈡优势：提供了线程安全的共享对象</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">.</span> <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">㈢与其它同步机制的区别：同步机制是为了同步多个线程对相同资源的并发访问，是为了多个线程之间进行通信；而</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">ThreadLocal</span> <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">是隔离多个线程的数据共享，从根本上就不在多个线程之间共享资源，这样当然不需要多个线程进行同步了。</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">.</span> <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">㈣使用技巧：需要多个线程之间进行通信：使用同步机制；如果需要隔离多个线程之间的共享冲突：推荐使用</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">ThreadLocal</span> <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">（线程安全）</span> <br><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p><br><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font style="BACKGROUND-COLOR: #a52a2a">volatile</font> </span><br><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp; .<font face="Times New Roman" size=3></font><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">㈠</span><font face="Times New Roman" size=3></font>volatile</span> <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">修饰的成员变量在每次被线程访问时，都强迫从共享内存中重读该成员变量的值。而且，当成员变量发生变化时，强迫线程将变化值回写到共享内存。<br><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">.</span><font face="Times New Roman" size=3></font><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">㈡优势：</span>这样在任何时刻，两个不同的线程总是看到某个成员变量的同一个值。</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">.</span> <font face="Times New Roman" size=3></font><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">㈢缘由：</span>Java</span> <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">语言规范中指出：为了获得最佳速度，允许线程保存共享成员变量的私有拷贝，而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">这样当多个线程同时与某个对象交互时，就必须要注意到要让线程及时的得到共享成员变量的变化。</span> <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">volatile</span> <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">关键字就是提示</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">VM</span> <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">：对于这个成员变量不能保存它的私有拷贝，而应直接与共享成员变量交互。</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br></span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">.</span> <font face="Times New Roman" size=3></font><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">㈣使用技巧：</span>在两个或者更多的线程访问的成员变量上使用</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">volatile</span> <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">。当要访问的变量已在</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">synchronized</span> <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">代码块中，或者为常量时，不必使用。</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">由于使用</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">volatile</span> <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">屏蔽掉了</span> <span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">VM</span> <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">中必要的代码优化，所以在效率上比较低，因此一定在必要时才使用此关键字。<br><br><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font style="BACKGROUND-COLOR: #a52a2a">阐释</font>：<br>线程为了提高效率，将某成员变量</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">(</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">如</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">A)</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">拷贝了一份（如</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">B</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">），线程中对</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">A</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的访问其实访问的是</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">B</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br clear=all></span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">只在某些动作时才进行</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">A</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">和</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">B</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的同步，因此存在</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">A</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">和</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">B</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">不一致的情况。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">volatile</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">就是用来避免这种情况的。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br clear=all>volatile</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">告诉</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">jvm</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">，</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"></span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">它所修饰的变量不保留拷贝，直接访问主内存中的（也就是上面说的</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">A)<br><br><font style="BACKGROUND-COLOR: #800080">sleep()&nbsp; vs&nbsp;wait()</font>&nbsp;<span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;sleep是线程类（Thread）的方法，导致此线程暂停执行指定时间，把执行机会给其他线程，但是监控状态依然保持，到时后会自动恢复。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用sleep不会释放对象锁。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;wait是Object类的方法，对此对象调用wait方法导致本线程放弃对象锁，进入等待此对象的等待锁定池，只有针对此对象发出notify方法（或notifyAll）后本线程才 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 进入对象锁定池准备获得对象锁进入运行状态。<br><br><br><br><br>===================2007-05-01引用如下内容===========<br></p>
<div class=postTitle><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/simpleobject/archive/2005/09/14/236941.html"><font color=#000080>[转]ThreadLocal的设计与使用</font></a> </div>
<div class=postText>早在Java 1.2推出之时，Java平台中就引入了一个新的支持：java.lang.ThreadLocal，给我们在编写多线程程序时提供了一种新的选择。使用这个工具类可以很简洁地编写出优美的多线程程序，虽然ThreadLocal非常有用，但是似乎现在了解它、使用它的朋友还不多。 <br><br>　　<strong>ThreadLocal是什么</strong><br><br>　　ThreadLocal是什么呢？其实ThreadLocal并非是一个线程的本地实现版本，它并不是一个Thread，而是thread local variable（线程局部变量）。也许把它命名为ThreadLocalVar更加合适。线程局部变量（ThreadLocal）其实的功用非常简单，就是为每一个使用该变量的线程都提供一个变量值的副本，是每一个线程都可以独立地改变自己的副本，而不会和其它线程的副本冲突。从线程的角度看，就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明，在其它的一些语言编译器实现（如IBM XL FORTRAN）中，它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持，而是提供了一个ThreadLocal的类来提供支持，所以，在Java中编写线程局部变量的代码相对比较笨拙，这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。<br><br>　　<strong>ThreadLocal的设计</strong><br><br>　　首先看看ThreadLocal的接口：<br><br>　　Object get() ; // 返回当前线程的线程局部变量副本 protected Object initialValue(); // 返回该线程局部变量的当前线程的初始值void set(Object value); // 设置当前线程的线程局部变量副本的值<br><br>　　ThreadLocal有3个方法，其中值得注意的是initialValue()，该方法是一个protected的方法，显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值，这个方法是一个延迟调用方法，在一个线程第1次调用get()或者set(Object)时才执行，并且仅执行1次。ThreadLocal中的确实实现直接返回一个null：<br><br></font>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td><font color=#a52a2a>protected Object initialValue() { return null; }</font></td>
        </tr>
    </tbody>
</table>
<br><font color=#a52a2a>　　ThreadLocal是如何做到为每一个线程维护变量的副本的呢？其实实现的思路很简单，在ThreadLocal类中有一个Map，用于存储每一个线程的变量的副本。比如下面的示例实现：<br><br></font>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td><font color=#a52a2a>public class ThreadLocal<br>{<br>　private Map values = Collections.synchronizedMap(new HashMap());<br>　public Object get()<br>　{<br>　　Thread curThread = Thread.currentThread(); <br>　　Object o = values.get(curThread); <br>　　if (o == null &amp;&amp; !values.containsKey(curThread))<br>　　{<br>　　　o = initialValue();<br>　　　values.put(curThread, o); <br>　　}<br>　　return o; <br>　}<br><br>　public void set(Object newValue)<br>　{<br>　　values.put(Thread.currentThread(), newValue);<br>　}<br><br>　public Object initialValue()<br>　{<br>　　return null; <br>　}<br>}</font></td>
        </tr>
    </tbody>
</table>
<br><font color=#a52a2a>　　当然，这并不是一个工业强度的实现，但JDK中的ThreadLocal的实现总体思路也类似于此。<br><br>　　<strong>ThreadLocal的使用</strong><br><br>　　如果希望线程局部变量初始化其它值，那么需要自己实现ThreadLocal的子类并重写该方法，通常使用一个内部匿名类对ThreadLocal进行子类化，比如下面的例子，SerialNum类为每一个类分配一个序号：<br><br></font>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td><font color=#a52a2a>public class SerialNum <br>{<br>　// The next serial number to be assigned<br><br>　private static int nextSerialNum = 0; <br>　private static ThreadLocal serialNum = new ThreadLocal() <br>　{<br>　　protected synchronized Object initialValue() <br>　　{<br>　　　return new Integer(nextSerialNum++);<br>　　}<br>　};<br><br>　public static int get() <br>　{<br>　　return ((Integer) (serialNum.get())).intValue(); <br>　}<br>}</font></td>
        </tr>
    </tbody>
</table>
<br><font color=#a52a2a>　　SerialNum类的使用将非常地简单，因为get()方法是static的，所以在需要获取当前线程的序号时，简单地调用：<br><br></font>
<table width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td><font color=#a52a2a>int serial = SerialNum.get();</font></td>
        </tr>
    </tbody>
</table>
<br><font color=#a52a2a>　　即可。<br><br>　　在线程是活动的并且ThreadLocal对象是可访问的时，该线程就持有一个到该线程局部变量副本的隐含引用，当该线程运行结束后，该线程拥有的所以线程局部变量的副本都将失效，并等待垃圾收集器收集。<br><br>　　<strong>ThreadLocal与其它同步机制的比较</strong><br><br>　　ThreadLocal和其它同步机制相比有什么优势呢？ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突，在普通的同步机制中，是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的，使用这种同步机制需要很细致地分析在什么时候对变量进行读写，什么时候需要锁定某个对象，什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问，ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本，从而隔离了多个线程的数据，每一个线程都拥有自己的变量副本，从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象，在编写多线程代码时，可以把不安全的整个变量封装进ThreadLocal，或者把该对象的特定于线程的状态封装进ThreadLocal。<br><br>　　由于ThreadLocal中可以持有任何类型的对象，所以使用ThreadLocal get当前线程的值是需要进行强制类型转换。但随着新的Java版本（1.5）将模版的引入，新的支持模版参数的ThreadLocal&lt;T&gt;类将从中受益。也可以减少强制类型转换，并将一些错误检查提前到了编译期，将一定程度地简化ThreadLocal的使用。<br><br>　　<strong>总结</strong><br><br>　　当然ThreadLocal并不能替代同步机制，两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问，是为了多个线程之间进行通信的有效方式；而ThreadLocal是隔离多个线程的数据共享，从根本上就不在多个线程之间共享资源（变量），这样当然不需要对多个线程进行同步了。所以，如果你需要进行多个线程之间进行通信，则使用同步机制；如果需要隔离多个线程之间的共享冲突，可以使用ThreadLocal，这将极大地简化你的程序，使程序更加易读、简洁。<br></font><br></span></span></span></o:p></span></div>
<img src ="http://www.blogjava.net/crazycy/aggbug/75085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-10-14 01:10 <a href="http://www.blogjava.net/crazycy/archive/2006/10/14/75085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA基础(二)：函数执行顺序(构造函数，多态，this指针)</title><link>http://www.blogjava.net/crazycy/archive/2006/10/13/75015.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Fri, 13 Oct 2006 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/10/13/75015.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/75015.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/10/13/75015.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/75015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/75015.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &lt;示例1&gt;请写出运行结果Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1&nbsp;&nbsp;&nbsp;abstract&nbsp;&nbsp;&nbsp;class&nbsp;&nbsp;Glyph&nbsp;{&nbsp;2&...&nbsp;&nbsp;<a href='http://www.blogjava.net/crazycy/archive/2006/10/13/75015.html'>阅读全文</a><img src ="http://www.blogjava.net/crazycy/aggbug/75015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-10-13 15:53 <a href="http://www.blogjava.net/crazycy/archive/2006/10/13/75015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA基础(三)：for循环</title><link>http://www.blogjava.net/crazycy/archive/2006/10/13/74889.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Thu, 12 Oct 2006 16:38:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/10/13/74889.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/74889.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/10/13/74889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/74889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/74889.html</trackback:ping><description><![CDATA[for（expr1; expr2; expr3）的执行顺序：<br />----初始化工作的expr1;    <br /> ----判断expr2是否为真<br /><br />如果为真<br />-----执行for体<br />-----执行expr3<br />-----判断expr2是否为真<br />循环之<br /><br />如果为假<br />-----不执行for体<br />-----不执行expr3<br /><br />示例：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_26_381_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_381_Open_Text.style.display='none'; Codehighlighter1_26_381_Closed_Image.style.display='inline'; Codehighlighter1_26_381_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_26_381_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_381_Closed_Text.style.display='none'; Codehighlighter1_26_381_Open_Image.style.display='inline'; Codehighlighter1_26_381_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">   Delta    </span><span id="Codehighlighter1_26_381_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_26_381_Open_Text"><span style="COLOR: #000000">{   <br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_71_144_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_144_Open_Text.style.display='none'; Codehighlighter1_71_144_Closed_Image.style.display='inline'; Codehighlighter1_71_144_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_71_144_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_144_Closed_Text.style.display='none'; Codehighlighter1_71_144_Open_Image.style.display='inline'; Codehighlighter1_71_144_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">   foo(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">   c)  </span><span id="Codehighlighter1_71_144_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_71_144_Open_Text"><span style="COLOR: #000000">{   <br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          System.out.print(c);   <br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;   <br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000">   <br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img id="Codehighlighter1_202_376_Open_Image" onclick="this.style.display='none'; Codehighlighter1_202_376_Open_Text.style.display='none'; Codehighlighter1_202_376_Closed_Image.style.display='inline'; Codehighlighter1_202_376_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_202_376_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_202_376_Closed_Text.style.display='none'; Codehighlighter1_202_376_Open_Image.style.display='inline'; Codehighlighter1_202_376_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">   </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">   main(String[]   argv) </span><span id="Codehighlighter1_202_376_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_202_376_Open_Text"><span style="COLOR: #000000">{   <br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">   i   </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">   </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;   <br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img id="Codehighlighter1_301_365_Open_Image" onclick="this.style.display='none'; Codehighlighter1_301_365_Open_Text.style.display='none'; Codehighlighter1_301_365_Closed_Image.style.display='inline'; Codehighlighter1_301_365_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_301_365_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_301_365_Closed_Text.style.display='none'; Codehighlighter1_301_365_Open_Image.style.display='inline'; Codehighlighter1_301_365_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />          </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">   (foo(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);   foo(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)   </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">   (i   </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">   </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);   foo(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)) </span><span id="Codehighlighter1_301_365_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_301_365_Open_Text"><span style="COLOR: #000000">{   <br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;   <br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />              foo(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">D</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);   <br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />          }</span></span><span style="COLOR: #000000">   <br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000">   <br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">  </span></div><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_003745" onclick="this.style.display='none'; Code_Closed_Text_003745.style.display='none'; Code_Open_Image_003745.style.display='inline'; Code_Open_Text_003745.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_003745" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_003745.style.display='none'; Code_Closed_Image_003745.style.display='inline'; Code_Closed_Text_003745.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_003745" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">答案</span><span id="Code_Open_Text_003745" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">ABDCBDCB</span></span></div><img src ="http://www.blogjava.net/crazycy/aggbug/74889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-10-13 00:38 <a href="http://www.blogjava.net/crazycy/archive/2006/10/13/74889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA基础(一)：多态(overloading &amp; overridding)的分析</title><link>http://www.blogjava.net/crazycy/archive/2006/10/11/74622.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Wed, 11 Oct 2006 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/10/11/74622.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/74622.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/10/11/74622.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/74622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/74622.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &lt; 示例1&gt;																																						题目1																Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->					...&nbsp;&nbsp;<a href='http://www.blogjava.net/crazycy/archive/2006/10/11/74622.html'>阅读全文</a><img src ="http://www.blogjava.net/crazycy/aggbug/74622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-10-11 17:10 <a href="http://www.blogjava.net/crazycy/archive/2006/10/11/74622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(送给初学者2)Java学习之路：不走弯路，就是捷径 [转]  </title><link>http://www.blogjava.net/crazycy/archive/2006/10/09/74030.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Mon, 09 Oct 2006 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/10/09/74030.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/74030.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/10/09/74030.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/74030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/74030.html</trackback:ping><description><![CDATA[
		<table id="table1" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<div class="smallfont">
												<table id="table1" cellspacing="0" cellpadding="0" width="100%" border="0">
														<tbody>
																<tr>
																		<td>
																				<div class="smallfont">
																						<strong>在上一篇“</strong>
																						<a id="viewpost1_TitleUrl" href="/crazycy/archive/2006/07/07/57106.html">
																								<font color="#000080">
																										<strong>送给Java初学者1（常被问到这个问题，总结一下）</strong>
																								</font>
																						</a>
																						<strong>”中主要描述了几个常见问题，本篇引用网上一作品来继续阐述java学习之路。</strong>
																				</div>
																		</td>
																</tr>
														</tbody>
												</table>
												<br />
												<br />
												<strong>Java学习之路：不走弯路，就是捷径 [转]</strong>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
		<hr style="COLOR: #259700" size="1" />
		<!-- / icon and title -->
		<br />
		<!-- message -->
		<div>0．引言<br />软件开发之路是充满荆棘与挑战之路,也是充满希望之路。Java学习也是如此，没有捷径可走。梦想像《天龙八部》中虚竹一样被无崖子醍醐灌顶而轻松获得一甲子功力，是很不现实的。每天仰天大叫"天神啊，请赐给我一本葵花宝典吧"，殊不知即使你获得了葵花宝典，除了受自宫其身之苦外，你也不一定成得了"东方不败"，倒是成"西方失败"的几率高一点。 <br />"不走弯路，就是捷径"，佛经说的不无道理。 <br /></div>
		<div>
				<br />
				<br />1．如何学习程序设计？ <br />Java是一种平台，也是一种程序设计语言，如何学好程序设计不仅仅适用于Java，对C++等其他程序设计语言也一样管用。有编程高手认为，Java也好C也好没什么分别，拿来就用。为什么他们能达到如此境界？我想是因为编程语言之间有共通之处，领会了编程的精髓，自然能够做到一通百通。如何学习程序设计理所当然也有许多共通的地方。<br /> <br />1.1　培养兴趣 <br />兴趣是能够让你坚持下去的动力。如果只是把写程序作为谋生的手段的话，你会活的很累，也太对不起自己了。多关心一些行业趣事，多想想盖茨。不是提倡天天做白日梦，但人要是没有了梦想，你觉得有味道吗？可能像许多深圳本地农民一样，打打麻将，喝喝功夫茶，拜拜财神爷；每个月就有几万十几万甚至更多的进帐，凭空多出个"食利阶层"。你认为，这样有味道吗？有空多到一些程序员论坛转转，你会发现，他们其实很乐观幽默，时不时会冒出智慧的火花。 <br /><br />1.2　慎选程序设计语言 <br />男怕入错行，女怕嫁错郎。初学者选择程序设计语言需要谨慎对待。软件开发不仅仅是掌握一门编程语言了事，它还需要其他很多方面的背景知识。软件开发也不仅仅局限于某几个领域，而是已经渗透到了各行各业几乎每一个角落。 <br />如果你对硬件比较感兴趣，你可以学习C语言/汇编语言，进入硬件开发领域。如果你对电信的行业知识及网络比较熟悉，你可以在C/C++等之上多花时间，以期进入电信软件开发领域。如果你对操作系统比较熟悉，你可以学习C/Linux等等,为Linux内核开发/驱动程序开发/嵌入式开发打基础。 <br />如果你想介入到应用范围最广泛的应用软件开发（包括电子商务电子政务系统）的话，你可以选择J2EE或.NET，甚至LAMP组合。每个领域要求的背景知识不一样。做应用软件需要对数据库等很熟悉。总之，你需要根据自己的特点来选择合适你的编程语言。<br /> <br />1.3　要脚踏实地,快餐式的学习不可取 <br />先分享一个故事。 <br />有一个小朋友，他很喜欢研究生物学，很想知道那些蝴蝶如何从蛹壳里出来，变成蝴蝶便会飞。有一次，他走到草原上面看见一个蛹，便取了回家，然后看着，过了几天以后，这个蛹出了一条裂痕，看见里面的蝴蝶开始挣扎，想抓破蛹壳飞出来。 这个过程达数小时之久，蝴蝶在蛹里面很辛苦地拼命挣扎，怎么也没法子走出来。这个小孩看着看着不忍心，就想不如让我帮帮它吧，便随手拿起剪刀在蛹上剪开，使蝴蝶破蛹而出。 但蝴蝶出来以后，因为翅膀不够力，变得很臃肿，飞不起来。 <br />这个故事给我们的启示是：欲速则不达。 <br />浮躁是现代人最普遍的心态，能怪谁？也许是贫穷落后了这么多年的缘故，就像当年的大跃进一样，都想大步跨入***主义社会。现在的软件公司、客户、政府、学校、培训机构等等到处弥漫着浮躁之气。就拿我比较熟悉的大连大工IT职业培训来说吧，居然打广告宣称"20多年的计算机职业教育，辽宁省十佳学校"，殊不知中国计算机发展才几年，软件发展才几年，居然去报名的学生不少，简直是藐视天下程序员。培训出来的“程序员”大多不知道OO,OP为何物？社会环境如是，我们不能改变，只能改变自己,闹市中的安宁，弥足珍贵。许多初学者C++/Java没开始学，立马使用VC/JBuilder,会使用VC/JBuilder开发一个Hello World程序，就忙不迭的向世界宣告，"我会软件开发了"，简历上也大言不惭地写上"精通VC/Java"。结果到软件公司面试时要么被三两下打发走了，要么被驳的体无完肤，无地自容。到处碰壁之后才知道捧起《C++编程思想》《Java编程思想》仔细钻研，早知如此何必当初呀。 <br />"你现在讲究简单方便，你以后的路就长了"，好象也是佛经中的劝戒。<br /><br />1.4　多实践,快实践 <br />彭端淑的《为学一首示子侄》中有穷和尚与富和尚的故事。 <br />从前，四川边境有两个和尚，一个贫穷，一个有钱。一天，穷和尚对富和尚说："我打算去南海朝圣，你看怎么样？"富和尚说："这里离南海有几千里远，你靠什么去呢？"穷和尚说："我只要一个水钵，一个饭碗就够了。"富和尚为难地说："几年前我就打算买条船去南海，可至今没去成，你还是别去吧！" 一年以后，富和尚还在为租赁船只筹钱，穷和尚却已经从南海朝圣回来了。 <br />这个故事可解读为：任何事情，一旦考虑好了，就要马上上路，不要等到准备周全之后，再去干事情。假如事情准备考虑周全了再上路的话，别人恐怕捷足先登了。软件开发是一门工程学科，注重的就是实践，"君子动口不动手"对软件开发人员来讲根本就是错误的，他们提倡"动手至上"，但别害怕，他们大多温文尔雅，没有暴力倾向，虽然有时候蓬头垢面的一副"比尔盖茨"样。有前辈高人认为，学习编程的秘诀是：编程、编程、再编程，笔者深表赞同。不仅要多实践，而且要快实践。我们在看书的时候，不要等到你完全理解了才动手敲代码，而是应该在看书的同时敲代码，程序运行的各种情况可以让你更快更牢固的掌握知识点。 <br /><br />1.5　多参考程序代码 <br />程序代码是软件开发最重要的成果之一，其中渗透了程序员的思想与灵魂。许多人被《仙剑奇侠传》中凄美的爱情故事感动,悲剧的结局更有一种缺憾美。为什么要以悲剧结尾？据说是因为写《仙剑奇侠传》的程序员失恋而安排了这样的结局，他把自己的感觉融入到游戏中，却让众多的仙剑迷扼腕叹息。 <br />多多参考代码例子，对Java而言有参考文献[4.3],有API类的源代码(JDK安装目录下的src.zip文件)，也可以研究一些开源的软件或框架。 <br /><br />1.6　加强英文阅读能力 <br />对学习编程来说，不要求英语, 但不能一点不会,。最起码像Java API文档(参考文献[4.4])这些东西还是要能看懂的,连猜带懵都可以；旁边再开启一个"金山词霸"。看多了就会越来越熟练。在学Java的同时学习英文，一箭双雕多好。另外好多软件需要到英文网站下载，你要能够找到它们，这些是最基本的要求。英语好对你学习有很大的帮助。口语好的话更有机会进入管理层，进而可以成为剥削程序员的"周扒皮"。 <br /><br />1.7　万不得已才请教别人 <br />笔者在Martix与Java论坛的在线辅导系统中解决学生问题时发现，大部分的问题学生稍做思考就可以解决。请教别人之前，你应该先回答如下几个问题。 <br />你是否在google中搜索了问题的解决办法？ <br />你是否查看了Java API文档？ <br />你是否查找过相关书籍？ <br />你是否写代码测试过？ <br />如果回答都是"是"的话，而且还没有找到解决办法，再问别人不迟。要知道独立思考的能力对你很重要。要知道程序员的时间是很宝贵的。 <br /><br />1.8　多读好书 <br />书中自有颜如玉。比尔盖茨是一个饱读群书的人。虽然没有读完大学，但九岁的时候比尔盖茨就已经读完了所有的百科全书，所以他精通天文、历史、地理等等各类学科，可以说比尔?茨不仅是当今世界上金钱的首富，而且也可以称得上是知识的巨富。 <br />笔者在给学生上课的时候经常会给他们推荐书籍，到后来学生实在忍无可忍开始抱怨，"天呐，这么多书到什么时候才能看完了"，"学软件开发，感觉上了贼船"。这时候，我的回答一般是，"别着急，什么时候带你们去看看我的书房，到现在每月花在技术书籍上的钱400元，这在软件开发人员之中还只能够算是中等的"，学生当场晕倒。（注：这一部分学生是刚学软件开发的） <br /><br />1.9　使用合适的工具 <br />工欲善其事必先利其器。软件开发包含各种各样的活动，需求收集分析、建立用例模型、建立分析设计模型、编程实现、调试程序、自动化测试、持续集成等等，没有工具帮忙可以说是寸步难行。工具可以提高开发效率，使软件的质量更高BUG更少。组合称手的武器。到飞花摘叶皆可伤人的境界就很高了，无招胜有招，手中无剑心中有剑这样的境界几乎不可企及。<br /><br /><br />2．软件开发学习路线 <br />两千多年的儒家思想孔孟之道，中庸的思想透入骨髓，既不冒进也不保守并非中庸之道，而是找寻学习软件开发的正确路线与规律。 <br />从软件开发人员的生涯规划来讲，我们可以大致分为三个阶段，软件工程师→软件设计师→架构设计师或项目管理师。不想当元帅的士兵不是好士兵，不想当架构设计师或项目管理师的程序员也不是好的程序员。我们应该努力往上走。让我们先整理一下开发应用软件需要学习的主要技术。 <br />A．基础理论知识，如操作系统、编译原理、数据结构与算法、计算机原理等，它们并非不重要。如不想成为计算机科学家的话，可以采取"用到的时候再来学"的原则。 <br />B．一门编程语言，现在基本上都是面向对象的语言，Java/C++/C#等等。如果做WEB开发的话还要学习HTML/JavaScript等等。 <br />C．一种方法学或者说思想，现在基本都是面向对象思想（OOA/OOD/设计模式）。由此而衍生的基于组件开发CBD/面向方面编程AOP等等。 <br />D．一种关系型数据库，ORACLE/SqlServer/DB2/MySQL等等 <br />E．一种提高生产率的IDE集成开发环境JBuilder/Eclipse/VS.NET等。 <br />F．一种UML建模工具，用ROSE/VISIO/钢笔进行建模。 <br />G．一种软件过程，RUP/XP/CMM等等，通过软件过程来组织软件开发的众多活动，使开发流程专业化规范化。当然还有其他的一些软件工程知识。 <br />H．项目管理、体系结构、框架知识。 <br />正确的路线应该是：B→C→E→F→G→H。 <br />还需要补充几点： <br />1）．对于A与C要补充的是，我们应该在实践中逐步领悟编程理论与编程思想。新技术虽然不断涌现，更新速度令人眼花燎乱雾里看花；但万变不离其宗，编程理论与编程思想的变化却很慢。掌握了编程理论与编程思想你就会有拨云见日之感。面向对象的思想在目前来讲是相当关键的，是强势技术之一，在上面需要多投入时间，给你的回报也会让你惊喜。 <br />2）．对于数据库来说是独立学习的，这个时机就由你来决定吧。 <br />3）．编程语言作为学习软件开发的主线，而其余的作为辅线。 <br />4）．软件工程师着重于B、C、E、D；软件设计师着重于B、C、E、D、F；架构设计师着重于C、F、H。<br /> <br /><br />3．如何学习Java? <br />3.1 Java学习路线 <br />3.1.1 基础语法及Java原理 <br />基础语法和Java原理是地基，地基不牢靠，犹如沙地上建摩天大厦，是相当危险的。学习Java也是如此，必须要有扎实的基础，你才能在J2EE、J2ME领域游刃有余。参加SCJP（SUN公司认证的Java程序员）考试不失为一个好方法，原因之一是为了对得起你交的1200大洋考试费，你会更努力学习，原因之二是SCJP考试能够让你把基础打得很牢靠，它要求你跟JDK一样熟悉Java基础知识；但是你千万不要认为考过了SCJP就有多了不起，就能够获得软件公司的青睐，就能够获取高薪，这样的想法也是很危险的。获得"真正"的SCJP只能证明你的基础还过得去，但离实际开发还有很长的一段路要走。 <br /><br />3.1.2 OO思想的领悟 <br />掌握了基础语法和Java程序运行原理后，我们就可以用Java语言实现面向对象的思想了。面向对象，是一种方法学;是独立于语言之外的编程思想;是CBD基于组件开发的基础;属于强势技术之一。当以后因工作需要转到别的面向对象语言的时候，你会感到特别的熟悉亲切，学起来像喝凉水这么简单。 <br />使用面向对象的思想进行开发的基本过程是： <br />●调查收集需求。 <br />●建立用例模型。 <br />●从用例模型中识别分析类及类与类之间的静态动态关系，从而建立分析模型。 <br />●细化分析模型到设计模型。 <br />●用具体的技术去实现。 <br />●测试、部署、总结。 <br /><br />3.1.3 基本API的学习 <br />进行软件开发的时候，并不是什么功能都需要我们去实现，也就是经典名言所说的"不需要重新发明轮子"。我们可以利用现成的类、组件、框架来搭建我们的应用，如SUN公司编写好了众多类实现一些底层功能，以及我们下载过来的JAR文件中包含的类,我们可以调用类中的方法来完成某些功能或继承它。那么这些类中究竟提供了哪些方法给我们使用？方法的参数个数及类型是？类的构造器需不需要参数？总不可能SUN公司的工程师打国际长途甚至飘洋过海来告诉你他编写的类该如何使用吧。他们只能提供文档给我们查看，Java DOC文档（参考文献4.4）就是这样的文档，它可以说是程序员与程序员交流的文档。 <br />基本API指的是实现了一些底层功能的类，通用性较强的API，如字符串处理/输入输出等等。我们又把它成为类库。熟悉API的方法一是多查Java DOC文档（参考文献4.4），二是使用JBuilder/Eclipse等IDE的代码提示功能。 <br /><br />3.1.4 特定API的学习 <br />Java介入的领域很广泛，不同的领域有不同的API，没有人熟悉所有的API，对一般人而言只是熟悉工作中要用到的API。如果你做界面开发，那么你需要学习Swing/AWT/SWT等API；如果你进行网络游戏开发，你需要深入了解网络API/多媒体API/2D3D等；如果你做WEB开发，就需要熟悉Servlet等API啦。总之，需要根据工作的需要或你的兴趣发展方向去选择学习特定的API。 <br /><br />3.1.5 开发工具的用法 <br />在学习基础语法与基本的面向对象概念时，从锻炼语言熟练程度的角度考虑，我们推荐使用的工具是Editplus/JCreator+JDK,这时候不要急于上手JBuilder/Eclipse等集成开发环境，以免过于关注IDE的强大功能而分散对Java技术本身的注意力。过了这一阶段你就可以开始熟悉IDE了。 <br />程序员日常工作包括很多活动，编辑、编译及构建、调试、单元测试、版本控制、维持模型与代码同步、文档的更新等等，几乎每一项活动都有专门的工具，如果独立使用这些工具的话，你将会很痛苦，你需要在堆满工具的任务栏上不断的切换，效率很低下，也很容易出错。在JBuilder、Eclipse等IDE中已经自动集成编辑器、编译器、调试器、单元测试工具JUnit、自动构建工具ANT、版本控制工具CVS、DOC文档生成与更新等等，甚至可以把UML建模工具也集成进去，又提供了丰富的向导帮助生成框架代码，让我们的开发变得更轻松。应该说IDE发展的趋势就是集成软件开发中要用到的几乎所有工具。 <br />从开发效率的角度考虑，使用IDE是必经之路，也是从一个学生到一个职业程序员转变的里程碑。 <br />Java开发使用的IDE主要有Eclipse、JBuilder、JDeveloper、NetBeans等几种；而Eclipse、JBuilder占有的市场份额是最大的。JBuilder在近几年来一直是Java集成开发环境中的霸主，它是由备受程序员尊敬的Borland公司开发，在硝烟弥漫的Java IDE大战中,以其快速的版本更新击败IBM的Visual Age for Java等而成就一番伟业。IBM在Visual Age for Java上已经无利可图之下，干脆将之贡献给开源社区，成为Eclipse的前身，真所谓"柳暗花明又一村"。浴火重生的Eclipse以其开放式的插件扩展机制、免费开源获得广大程序员（包括几乎所有的骨灰级程序员）的青睐，极具发展潜力。 <br /><br />3.1.6 学习软件工程 <br />对小型项目而言，你可能认为软件工程没太大的必要。随着项目的复杂性越来越高，软件工程的必要性才会体现出来。参见"软件开发学习路线"小节。 <br /><br />3.2学习要点 <br />确立的学习路线之后，我们还需要总结一下Java的学习要点，这些要点在前文多多少少提到过，只是笔者觉得这些地方特别要注意才对它们进行汇总，不要嫌我婆婆妈妈啊。<br /> <br />3.2.1勤查API文档 <br />当程序员编写好某些类，觉得很有成就感,想把它贡献给各位苦难的同行。这时候你要使用"Javadoc"工具（包含在JDK中）生成标准的Java DOC文档,供同行使用。J2SE/J2EE/J2ME的DOC文档是程序员与程序员交流的工具，几乎人手一份，除了菜鸟之外。J2SE DOC文档官方下载地址：<a href="http://java.sun.com/j2se/1.5.0/download.jsp，你可以到google搜索CHM版本下载。也可以在线查看：http://Java.sun.com/j2se/1.5.0/docs/api/index.html。" target="_blank"><font color="#195c0e">http://Java.sun.com/j2se/1.5.0/down...pi/index.html。</font></a><br />对待DOC文档要像毛主席语录，早上起床念一遍，吃饭睡觉前念一遍。 <br />当需要某项功能的时候，你应该先查相应的DOC文档看看有没有现成的实现，有的话就不必劳神费心了直接用就可以了，找不到的时候才考虑自己实现。使用步骤一般如下： <br />●找特定的包，包一般根据功能组织。 <br />●找需要使用类，类命名规范的话我们由类的名字可猜出一二。 <br />●选择构造器，大多数使用类的方式是创建对象。 <br />●选择你需要的方法。 <br /><br />3.2.2 查书/google-&gt;写代码测试-&gt;查看源代码-&gt;请教别人 <br />当我们遇到问题的时候该如何解决？ <br />这时候不要急着问别人，太简单的问题，没经过思考的问题，别人会因此而瞧不起你。可以先找找书，到google中搜一下看看，绝大部分问题基本就解决了。而像"某些类/方法如何使用的问题"，DOC文档就是答案。对某些知识点有疑惑是，写代码测试一下，会给你留下深刻的印象。而有的问题，你可能需要直接看API的源代码验证你的想法。万不得已才去请教别人。<br /> <br />3.2.3学习开源软件的设计思想 <br />Java领域有许多源代码开放的工具、组件、框架，JUnit、ANT、Tomcat、Struts、Spring、Jive论坛、PetStore宠物店等等多如牛毛。这些可是前辈给我们留下的瑰宝呀。入宝山而空手归，你心甘吗？对这些工具、框架进行分析，领会其中的设计思想，有朝一日说不定你也能写一个XXX框架什么的，风光一把。分析开源软件其实是你提高技术、提高实战能力的便捷方法。 <br /><br />3.2.4 规范的重要性 <br />没有规矩，不成方圆。这里的规范有两层含义。第一层含义是技术规范，多到<a href="http://www.jcp.org下载jsrxxx规范，多读规范，这是最权威准确最新的教材。第二层含义是编程规范，如果你使用了大量的独特算法，富有个性的变量及方法的命名方式；同时，没给程序作注释，以显示你的编程功底是多么的深厚。这样的代码别人看起来像天书，要理解谈何容易，更不用说维护了，必然会被无情地扫入垃圾堆。java编码规范到此查看或下载http://Java.sun.com/docs/codeconv/，中文的也有，啊，还要问我在哪，请参考3.2.2节。" target="_blank"><font color="#195c0e">http://www.jcp.org下载JSRXXX规范，?..请参考3.2.2节。<br /></font></a><br />3.2.5 不局限于Java <br />很不幸，很幸运，要学习的东西还有很多。不幸的是因为要学的东西太多且多变，没时间陪老婆家人或女朋友，导致身心疲惫，严重者甚至导致抑郁症。幸运的是别人要抢你饭碗绝非易事，他们或她们需要付出很多才能达成心愿。 <br />Java不要孤立地去学习，需要综合学习数据结构、OOP、软件工程、UML、网络编程、数据库技术等知识，用横向纵向的比较联想的方式去学习会更有效。如学习Java集合的时候找数据结构的书看看；学JDBC的时候复习数据库技术；采取的依然是"需要的时候再学"的原则。 <br /><br /><br />4．结束语 <br />需要强调的是，学习软件开发确实有一定的难度，也很辛苦，需要付出很多努力，但千万不要半途而废。本文如果能对一直徘徊在Java神殿之外的朋友有所帮助的话，笔者也欣慰了。哈哈，怎么听起来老气横秋呀？没办法，在电脑的长期辐射之下，都快变成小老头了。最后奉劝各位程序员尤其是MM程序员，完成工作后赶快远离电脑，据《胡播乱报》报道，电脑辐射会在白皙的皮肤上面点缀一些小黑点，看起来鲜艳无比…… (文章提到的大连大工IT培训。本人没有任何攻击的意思)</div>
		<!-- / message -->
		<!-- sig -->
<img src ="http://www.blogjava.net/crazycy/aggbug/74030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-10-09 11:56 <a href="http://www.blogjava.net/crazycy/archive/2006/10/09/74030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程中的current thread not owner异常错误</title><link>http://www.blogjava.net/crazycy/archive/2006/10/08/73896.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Sun, 08 Oct 2006 11:21:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/10/08/73896.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/73896.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/10/08/73896.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/73896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/73896.html</trackback:ping><description><![CDATA[
		<span lang="EN-US" style="LINE-HEIGHT: 150%; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt">
				<font style="BACKGROUND-COLOR: #ffa500">非常感谢你的阅读，如果你觉得好或者对你有帮助，请积极给一个留言<strong>反馈</strong>以示鼓励。</font> <br /></span>
		<br />多线程常用的一些方法: wait(),wait(long),notify(),notifyAll()等<br /><br /><font color="#ff0000">这些方法是当前类的实例方法,<br /></font><br />wait()      是使持有对象锁的线程释放锁;<br />wait(long)是使持有对象锁的线程释放锁时间为long(毫秒)后,再次获得锁,wait()和wait(0)等价;<br />notify()    是唤醒一个正在等待该对象锁的线程,如果等待的线程不止一个,那么被唤醒的线程由jvm确定;<br />notifyAll  是唤醒所有正在等待该对象锁的线程.<br /><br />并且应该优先使用notifyAll()方法,因为唤醒所有线程比唤醒一个线程更容易让jvm找到最适合被唤醒的线程.<br /><br />对于上述方法,<font color="#ff0000">只有在当前线程中才能使用</font>,否则报运行时错误java.lang.IllegalMonitorStateException: current thread not owner.<br /><br />从实现角度来分析：<br /><font color="#ff1493">在线程调用wait()方法时，需要把它放到一个同步段里</font>，即应该在调用前使用<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img id="Codehighlighter1_15_43_Open_Image" onclick="this.style.display='none'; Codehighlighter1_15_43_Open_Text.style.display='none'; Codehighlighter1_15_43_Closed_Image.style.display='inline'; Codehighlighter1_15_43_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_15_43_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_15_43_Closed_Text.style.display='none'; Codehighlighter1_15_43_Open_Image.style.display='inline'; Codehighlighter1_15_43_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000">synchroed(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_15_43_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_15_43_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  thread.wait();<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <img src="http://www.blogjava.net/images/dot.gif" /><img src="http://www.blogjava.net/images/dot.gif" /><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />否则将会出现"java.lang.IllegalMonitorStateException: current thread not owner"的异常。<br /><br /><br /><font style="BACKGROUND-COLOR: #ffa500" face="Verdana">Thanks very much to visit blog,  <strong>welcome your feedback</strong>,  your feedback is the Driver &amp;&amp; Power to me</font><font face="Arial"></font><img src ="http://www.blogjava.net/crazycy/aggbug/73896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-10-08 19:21 <a href="http://www.blogjava.net/crazycy/archive/2006/10/08/73896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>送给Java初学者1（常被问到这个问题，总结一下）</title><link>http://www.blogjava.net/crazycy/archive/2006/07/07/57106.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Fri, 07 Jul 2006 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/07/07/57106.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/57106.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/07/07/57106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/57106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/57106.html</trackback:ping><description><![CDATA[  <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">只针对一些朋友的问题，写一些自己的心得，自己走过的路的经验整理出来，</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">share</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">之，姑妄言之姑妄听之<br /><br />1. </span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">初学者学习</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">JAVA</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">用哪本说好？</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><?xml:namespace prefix = o /?><o:p></o:p></span><p class="MsoNormal" style="MARGIN-LEFT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">个人觉得：初学者因为基础薄弱，从别人那里得到的建议往往有两种情况：</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">一是经典书籍，经典书籍对于初学者往往并不适合；</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">二可能是对方感到超级好的，但是处于的起跑线不一样，未必适合；</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><span>      </span></span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">我觉得初学者应该充分利用手头或者朋友或者从书店买一本，感觉自己能接受的，然后好好的读一下，最好是多遍，这样下来你就知道什么适合自己了，这个时候听取的建议往往才可以奏效。毕竟有了这个缓冲过程，记住：这个缓冲过程绝对是重要的。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><span>      </span></span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">试想：许多人把自己的经验告诉你，是为了让你少走弯路；你经历过的会觉得有道理；你没有经历的，往往体会不到，经历了后才后悔没有听从当初的建议。初学者入门也是一样的道理。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><span>      </span></span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">回想当时入门</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">java</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">时，只有</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">c</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">的理论基础，把自己学校老师写的一本</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">java</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">书在一年左右的时间内读了</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">7</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">遍</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">(2002</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">年网络上</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">java</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">资料相对还是匮乏的</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">)</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">，书上标记的密密麻麻，突然间迷糊灌顶豁然开朗了，就入门了。</span></p><p class="MsoNormal" style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">2. 初学者应该用什么工具？对于初学都来说是用</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">jdk</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">比较好，还是用</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">eclips</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">比较好呢？</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">如果说工具，推荐</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Eclipse</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">NetBean</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">，而不推荐</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">JBuilder</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">了。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">不伤及</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">JBuilder</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">簇拥者，我从</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">JB6</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">用到</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">2006</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">，也是一直捍卫</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">JB</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">的。但是现在的</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Eclipse</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">发展的真的不错，而且是开元的，所以推荐。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">NetBean5</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">之前，是非常鄙视的，到了</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">5</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">后还挺不错的，与</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">E</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">可以有的一拼，也推荐。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">但对新手，更推荐用</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">JDK+Editplus+JavaDoc</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">的；在命令行下运行。为什么？所有的配置文件和代码推荐自己手写，这样对于初学者可以弄清楚原理。因为</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">IDE</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">工具往往自动给你生成了，往往初学者得不到是其工作原理是怎么进行的.</span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; LINE-HEIGHT: 150%"><br /><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体"></span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%">3.  <span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">初学者是不是应该关注语言底层的东西？</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">关注语言底层的东西，对于以后的深入学习很重要的。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">当然基础也很重要。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">问题是不会走的时候，想跑似乎太费心力了。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">这里需要辩证的看，为了吃饭，就得符合或者适应时下业界的趋势；为了更好的发展</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"></span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">必须深入下去；深入下去或者为了以后的发展靠的是个人的努力。但是没有经验的累积以及大量代码的编写，想深入下去近乎不可能。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">所以对初学者来说，唯一的就是脚踏实地，写，写，写。累积后就能养出解决问题的办法，形成解决问题的能力后，就能在以后的学习路途上更进一步。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">初学者可以不要盯着架构、模式之类的，但是在一定的代码量后，都要反复的思考，是否可以抽取出来形成自己的一些公用的类，是否可以做成符合自己习惯的开发包？反复这个过程后，在请教先行者，或者在网络上查找相关方面的讨论（比如</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">JavaEye</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">），便会得到一个质的升华。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana"><o:p></o:p></span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体"><br /></span></p><p class="MsoNormal" style="TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">如果代码量累计到</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana">4w</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">行左右后，你再去看你看不懂的书，会发现很有心得或者豁然开朗了。当然如果这个过程缺乏了思考和总结，或许另当别论。</span></p>     <span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">附:记得与一个很有功底的朋友在网上交流时,他说的一句话,让我感触颇深:其实程序是不断试出来的....<br /></span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体"></span><p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana"><o:p><br /><strong>  送给初学者（二）：</strong><a href="/crazycy/archive/2006/10/09/74030.html"><strong>http://www.blogjava.net/crazycy/archive/2006/10/09/74030.html</strong></a></o:p></span></p><img src ="http://www.blogjava.net/crazycy/aggbug/57106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-07-07 12:38 <a href="http://www.blogjava.net/crazycy/archive/2006/07/07/57106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又是48，49JDK版本不兼容（Unsupported major.minor version 49.0）(系列二)</title><link>http://www.blogjava.net/crazycy/archive/2006/06/03/50150.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Sat, 03 Jun 2006 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/06/03/50150.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/50150.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/06/03/50150.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/50150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/50150.html</trackback:ping><description><![CDATA[
		<span lang="EN-US" style="LINE-HEIGHT: 150%; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt">
				<font style="BACKGROUND-COLOR: #ffa500">非常感谢你的阅读，如果你觉得好或者对你有帮助，请<strong>积极给一个留言反馈</strong>以示鼓励。</font> <br /></span>
		<br />倒霉的孩子，看过本系列的<a href="/crazycy/archive/2006/05/31/49225.html">第一篇</a>之后,你搞定了么?!<br /><br /><br />估计有许多人依然不能;但是IDE环境中的绝对没有问题；<br /><br />可是离开IDE（JBuilder、Eclipse+MyEclipse），只在Tomcat下运行依然不行，是不是？！不要问是不是Tomcat5.0系列不支持JDK1.5，我在<a href="../archive/2006/05/31/49225.html">第一篇</a>中已经告诉你怎么干了，可是为啥还不行呢？！甚至有人安装、卸载了好几次JDK1.4 JDK1.5，可怜啊；抱一起哭吧；我也遇到了这个问题。<br /><br />在捣鼓了一顿后，总结如下：<br />只在Tomcat下运行，但是依然出现“Unsupported major.minor version 49.0”，我捣鼓了大概120分钟：<br />   1. java -version 看显示的JDK版本<br />   2. 如果显示版本是1.5，但还是不能运行，则必须验证如下两点：<br />          * 是否按<a href="../archive/2006/05/31/49225.html">第一篇</a>教给你的格式做了，（没有的话，我则白白总结了，哎）<br />          * 查看注册表，修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft下的关于1.4的jre和jvm的路径信息改为1.5的jdk的即可。<br /><br /><br />估计还是不行。<br />为啥？因为你安装Tomcat5.0系列时指定了JRE了啊，难道你以为环境变量里修改了就OK了么？<br /><br />不是这样的。你进入Tomcat5.0的安装目录，bin下是不是有个tomcat5w.exe文件，你打开看看java标签项<br /><br />看到Java Virtual Machine这个选项是什么了吧？ 不是JDK1.5。<br />还等着干什么？！ 修改，然后开始喝香槟庆祝郁闷解除了吧<br /><br /><br /><span lang="EN-US" style="LINE-HEIGHT: 150%; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt"><font style="BACKGROUND-COLOR: #ffffff" face="Verdana">   <font style="BACKGROUND-COLOR: #ffa500">Thanks very much to visit blog,  <strong>welcome your feedback</strong>,  your feedback is the Driver &amp;&amp; Power to me</font></font></span><img src ="http://www.blogjava.net/crazycy/aggbug/50150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-06-03 17:02 <a href="http://www.blogjava.net/crazycy/archive/2006/06/03/50150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又是48，49JDK版本不兼容（Unsupported major.minor version 49.0）(系列一)</title><link>http://www.blogjava.net/crazycy/archive/2006/05/31/49225.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Wed, 31 May 2006 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/05/31/49225.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/49225.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/05/31/49225.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/49225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/49225.html</trackback:ping><description><![CDATA[
		<span lang="EN-US" style="LINE-HEIGHT: 150%; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt">
				<font style="BACKGROUND-COLOR: #ffa500">非常感谢你的阅读，如果你觉得好或者对你有帮助，请<strong>积极给一个留言反馈</strong>以示鼓励。</font> <br /></span>
		<br />随着JDK版本的升级，尤其是JDK1.4升级到JDK5.0，在Java程序中我们往往会遭遇两种尴尬：<br />1 Unsupported major.minor version 49.0<br />2 当前的版本是49.0，需要的是48.0（大概是这个意思）<br /><br />第一种情况在java应用程序、web应用程序都有遇到<br />第二种情况我遇到的是表现在web应用程序中<br /><br />问题分析：<br />48，49是Java编译器内部的版本号，48表示是用JDK1.4来编译运行程序的，49表示是用JDK编译运行程序的<br /><br />问题解决：<br /><ul><li>方法一
<ul><li>方式：重新用JDK1.4编译，并在JDK1.4的环境下（包括修改JAVA_HOME,PATH,CLASSPATH,Tomcat使用的JDK）运行；
</li><li>效果：java应用程序可行；Web应用程序失败。<br /></li></ul></li><li>方法二
<ul><li>方式：采用JDK5.0编译，并在JDK5.0下运行（包括修改JAVA_HOME,PATH,CLASSPATH,Tomcat使用的JDK）</li></ul><ul><li>效果：java应用程序可行；Web应用程序可以。</li></ul></li></ul>关于方法二的两点特殊补充<br /><ul><li>特殊说明一：</li></ul>如果采用了方式二，即JDK5.0，要求Tomcat版本必须不能低于5.5*。问题是如果我需要用低于5.5*版本的Tomcat怎么办呢？<br />答案就是：将JDK5.0的lib目录下的tools.jar覆盖 TOMCAT安装目录/common/lib下面的tools.jar,然后重启TOMCAT5.0就可以了<br /><br /><ul><li>特殊说明二:</li></ul>如果你选择的是Eclipse+MyEclipse开发环境,并且你选择的是在Eclipse下启动Tomcat,千万记住,一定要在windows菜单preference选项弹出的perference对话框中,选择MyEclipse--Application Server--Tomcat5---JDK指定JDK为5.0<br /><br /><br />是不是搞定了IDE下的问题了呢？<br />如果在Tomcat5.0系列下还有问题的话，请跟踪系列二<a href="/crazycy/archive/2006/06/03/50150.html">http://www.blogjava.net/crazycy/archive/2006/06/03/50150.html</a><br /><br /><br /><font style="BACKGROUND-COLOR: #ffa500" face="Verdana">Thanks very much to visit blog,  <strong>welcome your feedback</strong>,  your feedback is the Driver &amp;&amp; Power to me</font><font face="Arial"></font><br /><br /><br /><img src ="http://www.blogjava.net/crazycy/aggbug/49225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-05-31 13:26 <a href="http://www.blogjava.net/crazycy/archive/2006/05/31/49225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异常的总结（Checked Exception）</title><link>http://www.blogjava.net/crazycy/archive/2006/05/10/45556.html</link><dc:creator>crazycy</dc:creator><author>crazycy</author><pubDate>Wed, 10 May 2006 14:50:00 GMT</pubDate><guid>http://www.blogjava.net/crazycy/archive/2006/05/10/45556.html</guid><wfw:comment>http://www.blogjava.net/crazycy/comments/45556.html</wfw:comment><comments>http://www.blogjava.net/crazycy/archive/2006/05/10/45556.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/crazycy/comments/commentRss/45556.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/crazycy/services/trackbacks/45556.html</trackback:ping><description><![CDATA[
		<font style="BACKGROUND-COLOR: #ff0000">最近查了许多关于异常的资料</font>，Java 异常分为Checked Exception 和 UnChecked Exception。对于现有的编程语言来说，Java是唯一提供Checked Exception机制的流行语言。<br /><br />   我在工程的开发中，对异常的定义常存在粒度上的考虑，如果粒度较细，定义到具体类型的异常，总觉力不从心。所以常常采用粗粒度开发，即以包为粒度，一个包定义一个异常（Checked Exception ）。<br /><br />   在方法相互调用时，在各个包相互关联的时候，常常只是把这个异常作为新异常的cause抛出。在很少的时候才进行相应的处理（比如内存溢出，做一些相应的抛弃工作），最多的时候只是记录日志继续抛出。<br /><br />   在查阅Checked Exception的作用时，大多书籍都是如下意思：捕获到错误，是为了进行处理，如果处理不了或者不处理就继续往上层传，直到一个地方来处理这个异常。在我所做的工作中，确实有需要处理的地方，但是直接到最外层显示给用户的更多。<br /><br />   在大量的资料中，有如下归纳：假如调用无法对抛出的意外做任何处理，就抛出UnChecked Exception；如果能对抛出的异常进行处理，则用Checked Exception。  <br /><br />   <img src ="http://www.blogjava.net/crazycy/aggbug/45556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/crazycy/" target="_blank">crazycy</a> 2006-05-10 22:50 <a href="http://www.blogjava.net/crazycy/archive/2006/05/10/45556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>