﻿<?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