﻿<?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-Jhonney的专栏</title><link>http://www.blogjava.net/Jhonney/</link><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;----人见人爱</description><language>zh-cn</language><lastBuildDate>Sun, 07 Sep 2008 04:38:58 GMT</lastBuildDate><pubDate>Sun, 07 Sep 2008 04:38:58 GMT</pubDate><ttl>60</ttl><item><title>【原创】自己写的一个分页程序</title><link>http://www.blogjava.net/Jhonney/archive/2008/04/26/196108.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Fri, 25 Apr 2008 16:48:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2008/04/26/196108.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/196108.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2008/04/26/196108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/196108.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/196108.html</trackback:ping><description><![CDATA[<p>年初时帮朋友写了分页程序，主要由于考虑到他的应用数据量很大<br />
程序元旦时已完成，也懒得发出来<br />
大体思想：分页的核心思想采用Iterator模式，每次从数据库中取定量的数据块<br />
其中block和pageCount是两个不同的概念，block是块，规定了从数据库中获取的数量<br />
pageCount为表现层每页显示的数量<br />
另外参数中还包含缓存的时间的设置<br />
程序分核心jar包和测试包，测试包以SPring为基础框架<br />
http://www.chinadforce.com/viewthread.php?tid=878261&amp;extra=page%3D4<br />
</p>
<img src ="http://www.blogjava.net/Jhonney/aggbug/196108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2008-04-26 00:48 <a href="http://www.blogjava.net/Jhonney/archive/2008/04/26/196108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>classloader总结</title><link>http://www.blogjava.net/Jhonney/archive/2008/04/04/190798.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Fri, 04 Apr 2008 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2008/04/04/190798.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/190798.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2008/04/04/190798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/190798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/190798.html</trackback:ping><description><![CDATA[项目时需要对外提供一些服务接口，写了接口及其实现发现报castClassException，当时newInstance时采用<br />
Thread.currentContext.getClassLoader的形式，分析了一下发现平台采用了自己的classloader<br />
<br />
1.java的classloader采用双亲委托的机制<br />
2.当前类加载器和线程上下文的区别是，当前类加载器在加载caller类时已经确定，但thread's context classloader is modifiable<br />
3.thread's classloader can break through the parent delegation mechanism of classloader<br />
4.it is should keep the thread's classloader same as current class classloader<br />
5.the default form of class.forname isn't recommend,because of exception of initializing static field if the classloader is not<br />
destroied<br />
6.banq comment about adoption thread's&nbsp; classloader is not correctly<br />
<br />
<img src ="http://www.blogjava.net/Jhonney/aggbug/190798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2008-04-04 16:45 <a href="http://www.blogjava.net/Jhonney/archive/2008/04/04/190798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>走出ClassLoader迷宫</title><link>http://www.blogjava.net/Jhonney/archive/2008/03/23/187966.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Sat, 22 Mar 2008 18:57:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2008/03/23/187966.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/187966.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2008/03/23/187966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/187966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/187966.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体;">quto:http://www.blogjava.net/lihuaxajh/articles/94371.html<br />
other resources:<br />
&nbsp;&nbsp;&nbsp; 1.http://www.javaworld.com/javaworld/javaqa/2003-06/01-qa-0606-load.html?page=1<br />
&nbsp;&nbsp;&nbsp; 2.http://www.javaworld.com/javaworld/javaqa/2003-06/01-qa-0606-load.html?page=2&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp; 3.http://www.javaworld.com/javaworld/javaqa/2003-03/01-qa-0314-forname.html<br />
&nbsp;&nbsp;&nbsp; 4.http://www.theserverside.com/news/thread.tss?thread_id=40763<br />
&nbsp;&nbsp;&nbsp; 5.http://www.matrix.org.cn/resource/article/43/43875_Class_Loading.html<br />
&nbsp;&nbsp;&nbsp; 6.http://blog.sina.com.cn/s/blog_4b6047bc0100096v.html<br />
&nbsp;&nbsp;&nbsp; 7.http://blog.sina.com.cn/s/blog_4b6047bc0100097p.html<br />
这个问题经常出现在编写框架代码</span>
<span lang="EN-US">, </span>
<span style="font-family: 宋体;">需要动态加载很多类和资源的时候</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">通常当你需要动态加载资源的时候</span>
<span lang="EN-US">, </span>
<span style="font-family: 宋体;">你至少有三个</span>
<span lang="EN-US">ClassLoader</span>
<span style="font-family: 宋体;">可以选择</span>
<span lang="EN-US">: </span>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
</p>
<ol>
    <li><span style="font-family: Wingdings;" lang="EN-US">
    <span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span></span><span style="font-family: 宋体;">系统类加载器或叫作应用类加载器</span>
    <span style="font-family: Wingdings;" lang="EN-US">(system classloader or application classloader)</span></li>
    <li><span style="font-family: Wingdings;" lang="EN-US"><span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;</span></span></span><span style="font-family: 宋体;">当前类加载器</span><span style="font-family: Wingdings;" lang="EN-US"></span></li>
    <li><span style="font-family: Wingdings;" lang="EN-US"><span><span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;</span></span></span><span style="font-family: 宋体;">当前线程类加载器</span></li>
</ol>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span style="font-family: 宋体;">上面的问题指的是最后一种类加载器</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">哪种类加载器是正确的选择呢</span>
<span lang="EN-US">?</span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%;">
<span style="font-family: 宋体;">第一种选择可以很容易地排除</span>
<span lang="EN-US">: </span>
<span style="font-family: 宋体;">系统类加载器</span>
<span lang="EN-US">(system classloader). </span>
<span style="font-family: 宋体;">这个类加载器处理</span>
<span lang="EN-US">-classpath</span>
<span style="font-family: 宋体;">下的类加载工作</span>
<span lang="EN-US">, </span>
<span style="font-family: 宋体;">可以通过</span>
<span lang="EN-US">ClassLoader.getSystemClassLoader()</span>
<span style="font-family: 宋体;">方法调用</span>
<span lang="EN-US">. ClassLoader</span>
<span style="font-family: 宋体;">下所有的</span>
<span lang="EN-US">getSystemXXX()</span>
<span style="font-family: 宋体;">的静态方法都是通过这个方法定义的</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">在你的代码中</span>
<span lang="EN-US">, </span>
<span style="font-family: 宋体;">你应该尽量少地调用这个方法</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">以其它的类加载器作为代理</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">否则你的代码将只能工作在简单的命令行应用中</span>
<span lang="EN-US">, </span>
<span style="font-family: 宋体;">这个时候系统类加载器</span>
<span lang="EN-US">(system classloader)</span>
<span style="font-family: 宋体;">是</span>
<span lang="EN-US">JVM</span>
<span style="font-family: 宋体;">最后创建的类加载器</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">一但你把代码移到</span>
<span lang="EN-US">EJB, Web</span>
<span style="font-family: 宋体;">应用或</span>
<span lang="EN-US">Java Web Start</span>
<span style="font-family: 宋体;">应用中</span>
<span lang="EN-US">, </span>
<span style="font-family: 宋体;">一定会出问题</span>
<span lang="EN-US">. </span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span lang="EN-US">
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">所以我们来看第二种选择</span>
<span lang="EN-US">: </span>
<span style="font-family: 宋体;">当前上下文环境下的类加载器</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">根据定义</span>
<span lang="EN-US">, </span>
<span style="font-family: 宋体;">当前类加载器就是你当前方法所属的类的加载器</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">在运行时类之间动态联编</span>
<span lang="EN-US">, </span>
<span style="font-family: 宋体;">及调用</span>
<span lang="EN-US">Class.forName,() Class.getResource()</span>
<span style="font-family: 宋体;">等类似方法时</span>
<span lang="EN-US">, </span>
<span style="font-family: 宋体;">这个类加载器会被隐含地使用</span>
<span lang="EN-US">. </span>
<span style="color: #ffcc00; font-family: 宋体;" lang="EN-US">It is also used by syntactic constructs like X.class class literals.</span>
<span style="font-family: 宋体;" lang="EN-US">
<o:p>
</o:p>
</span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span style="font-family: 宋体;" lang="EN-US">
<span>&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">线程上下文类型加载器是在<span lang="EN-US">Java 2</span>平台上被引入的<span lang="EN-US">. </span>每一个线程都有一个类加载器与之对应<span lang="EN-US">(</span>除非这个线程是被本地代码创建的<span lang="EN-US">). </span>这个类加载器是通过<span lang="EN-US">Thread.setContextClassLoaser()</span>方法设置的<span lang="EN-US">. </span>如果你不在线程构造后调用这个方法<span lang="EN-US">, </span>这个线程将从它的父线程中继承相应的上下文类加载器<span lang="EN-US">. </span>如果在整个应用中你不做任何特殊设置<span lang="EN-US">, </span>所有的线程将都以系统类加载器<span lang="EN-US">(system classloader)</span>作为自己的线程上下文类加载器<span lang="EN-US">. </span>自从<span lang="EN-US">Web</span>和<span lang="EN-US">J2EE</span>应用服务器使用成熟的类加载器机制来实现诸如<span lang="EN-US">JNDI, </span>线程池<span lang="EN-US">, </span>组件热部署等功能以来<span lang="EN-US">, </span>这种在整个应用中不做任何线程类加载器设置的情况就很少了<span lang="EN-US">.<o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span style="font-family: 宋体;" lang="EN-US">
<span>&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">为什么线程上下文类加载器存在于如此重要的位置呢<span lang="EN-US">? </span>这个概念在<span lang="EN-US">J2SE</span>中的引入并不引人注目<span lang="EN-US">. </span>很多开发人员对这一概念迷惑的原因是<span lang="EN-US">Sun</span>公司在这方面缺乏适当的指引和文档<span lang="EN-US">. <o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span style="font-family: 宋体;" lang="EN-US">
<span>&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">事实上<span lang="EN-US">, </span>上下文类加载器提供了类加载机制的后门<span lang="EN-US">, </span>这一点也在<span lang="EN-US">J2SE</span>中被引入了<span lang="EN-US">. </span>通常<span lang="EN-US">, </span>在<span lang="EN-US">JVM</span>中的所有类加载器被组织成了有继承层次的结构<span lang="EN-US">, </span>每一个类加载器<span lang="EN-US">(</span>除了引导<span lang="EN-US">JVM</span>的原始类加载器<span lang="EN-US">)</span>都有一个父加载器<span lang="EN-US">. </span>每当被请示加载类时<span lang="EN-US">, </span>类加载器都会首先请求其父类加载器<span lang="EN-US">, </span>只有当父类加载器不能加载时<span lang="EN-US">, </span>才会自己进行类加载<span lang="EN-US">.<o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span style="font-family: 宋体;" lang="EN-US">
<span>&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">有时候这种类加载的顺序安排不能正常工作<span lang="EN-US">, (<font color="#3300cc">此
处的意思是:正常情况下都是从子类加载器到根类加载器请求,万一有根类里需要加载子类时,这种顺序就不能满足要求,就要有一条反向的通道,即得到子类加载
器,这样就用到了thread context
classloader,因为通过thread.getcontextclassloader()可以得到子类加载器</font>).</span>通常当必须动态加载应用程序开发人员提供的资源的时候<span lang="EN-US">. </span>以<span lang="EN-US">JNDI</span>为例<span lang="EN-US">: </span>它的内容<span lang="EN-US">(</span>从<span lang="EN-US">J2SE1.3</span>开始<span lang="EN-US">)</span>就在<span lang="EN-US">rt.jar</span>中的引导类中实现了<span lang="EN-US">, </span>但是这些<span lang="EN-US">JNDI</span>核心类需要动态加载由独立厂商实现并部署在应用程序的<span lang="EN-US">classpath</span>下的<span lang="EN-US">JNDI</span>提供者<span lang="EN-US">. </span>这种情况就要求一个父<span lang="EN-US">classloader(</span>本例<span lang="EN-US">, </span>就是引导类加载器<span lang="EN-US">)</span>去加载对于它其中一个子<span lang="EN-US">classloader(</span>本例<span lang="EN-US">, </span>系统类加载器<span lang="EN-US">)</span>可见的类<span lang="EN-US">. </span>这时通常的类加载代理机制不能实现这个要求<span lang="EN-US">. </span>解决的办法<span lang="EN-US">(workaround)</span>就是<span lang="EN-US">, </span>让<span lang="EN-US">JNDI</span>核心类使用当前线程上下文的类加载器<span lang="EN-US">, </span>这样<span lang="EN-US">, </span>就基本的类加载代理机制的相反方向建立了一条有效的途径<span lang="EN-US">. <o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span style="font-family: 宋体;" lang="EN-US">
<span>&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">另外<span lang="EN-US">, </span>上面一段可能让你想起一些其它的事情<span lang="EN-US">: XML</span>解析<span lang="EN-US">Java API(JAXP). </span>是的<span lang="EN-US">, </span>当<span lang="EN-US">JAXP</span>只是<span lang="EN-US">J2SE</span>的扩展进<span lang="EN-US">, </span>它很自然地用当前类加载器来引导解析器的实现<span lang="EN-US">. </span>而当<span lang="EN-US">JAXP</span>被加入到<span lang="EN-US">J2SE1.4</span>的核心类库中时<span lang="EN-US">, </span>它的类加载也就改成了用当前线程类加载器<span lang="EN-US">, </span>与<span lang="EN-US">JNDI</span>的情况完全类似<span lang="EN-US">(</span>也使很多程序员很迷惑<span lang="EN-US">). </span>明白为什么我说来自<span lang="EN-US">Sun</span>的指导很缺乏了吧<span lang="EN-US">?<o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span style="font-family: 宋体;" lang="EN-US">
<span>&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">在以上的介绍之后<span lang="EN-US">, </span>我们来看关键问题<span lang="EN-US">: </span>这两种选择<span lang="EN-US">(</span>当前类加载器和当前线程类加载器<span lang="EN-US">)</span>都不是在所有环境下都适用<span lang="EN-US">. </span>有些人认为当前线程类加载器应该成为新的标准策略<span lang="EN-US">. </span>但是<span lang="EN-US">, </span>如果这样<span lang="EN-US">, </span>当多个线程通过共享数据进行交互的时<span lang="EN-US">, </span>将会呈现出一幅极其复杂的类加载的画面<span lang="EN-US">, </span>除非它们全部使用了同一个上下文的类加载器<span lang="EN-US">. </span>进一步说<span lang="EN-US">, </span>在某些遗留下来的解决方案中<span lang="EN-US">, </span>委派到当前类加载器的方法已经是标准<span lang="EN-US">. </span>比如对<span lang="EN-US">Class.forName(String)</span>的直接调用<span lang="EN-US">(</span>这也是我为什么推荐尽量避免对这个方法进行调用的原因<span lang="EN-US">). </span>即使你努力去只调用上下文相关的类加载器<span lang="EN-US">, </span>仍然会有一些代码会不由你控制<span lang="EN-US">. </span>这种不受控制的类加载委派机制是混入是很危险的<span lang="EN-US">. <o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span style="font-family: 宋体;" lang="EN-US">
<span>&nbsp;&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">更严重的问题<span lang="EN-US">, </span>某些应用服务器把环境上下文及当前类加载器设置到不同的类加载器实例上<span lang="EN-US">, </span>而这些类加载器有相同的类路径但却没有委派机制中的父子关系<span lang="EN-US">. </span>想想这为什么十分可怕<span lang="EN-US">. </span>要知道类加载器定义并加载的类实例会带有一个<span lang="EN-US">JVM</span>内部的<span lang="EN-US">ID</span>号<span lang="EN-US">. </span>如果当前类加载器加载一个类<span lang="EN-US">X</span>的实例<span lang="EN-US">, </span>这个实例调用<span lang="EN-US">JNDI</span>查找类<span lang="EN-US">Y</span>的实例<span lang="EN-US">, </span>些时的上下文的类加载器也可以定义了加载类<span lang="EN-US">Y</span>实例<span lang="EN-US">. </span>这个类<span lang="EN-US">Y</span>的定义就与当前类加载器看到的类<span lang="EN-US">Y</span>的定义不同<span lang="EN-US">. </span>如果进行强制类型转换<span lang="EN-US">, </span>则产生异常<span lang="EN-US">. <o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;">
<span style="font-family: 宋体;" lang="EN-US">
<span>&nbsp;&nbsp; </span>
</span>
<span style="font-family: 宋体;">这种混乱的情况还将在<span lang="EN-US">Java</span>中存在一段时间<span lang="EN-US">. </span>对于那些需要动态加载资源的<span lang="EN-US">J2SE</span>的<span lang="EN-US">API, </span>我们来猜想它们的类加策略<span lang="EN-US">. </span>例如<span lang="EN-US">:<o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
<span style="font-family: Wingdings;" lang="EN-US">
<span>&#216;<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>
</span>
<span style="font-family: 宋体;" lang="EN-US">JNDI</span>
<span style="font-family: 宋体;">使用线程上下文类加载器<span lang="EN-US"><o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
<span style="font-family: Wingdings;" lang="EN-US">
<span>&#216;<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>
</span>
<span style="font-family: 宋体;" lang="EN-US">Class.getResource()</span>
<span style="font-family: 宋体;">和<span lang="EN-US">Class.forName()</span>使用当前类加载器<span lang="EN-US"><o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
<span style="font-family: Wingdings;" lang="EN-US">
<span>&#216;<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>
</span>
<span style="font-family: 宋体;" lang="EN-US">JAXP(J2SE 1.4</span>
<span style="font-family: 宋体;">及之后<span lang="EN-US">)</span>使用线程上下文类加载器<span lang="EN-US"><o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
<span style="font-family: Wingdings;" lang="EN-US">
<span>&#216;<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>
</span>
<span style="font-family: 宋体;" lang="EN-US">java.util.ResourceBundle</span>
<span style="font-family: 宋体;">使用调用者的当前类加载器<span lang="EN-US"><o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
<span style="color: #ffcc00; font-family: Wingdings;" lang="EN-US">
<span>&#216;<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>
</span>
<span style="color: #ffcc00; font-family: 宋体;" lang="EN-US">URL
protocol handlers specified via java.protocol.handler.pkgs system
property are looked up in the bootstrap and system classloaders only<o:p></o:p></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%;">
<span style="font-family: Wingdings;" lang="EN-US">
<span>&#216;<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>
</span>
<span style="font-family: 宋体;" lang="EN-US">Java</span>
<span style="font-family: 宋体;">序列化<span lang="EN-US">API</span>默认使用调用者当前的类加载器<span lang="EN-US"><o:p></o:p></span></span>
</p>
<span style="font-family: 宋体;">这些类及资源的加载策略问题<span lang="EN-US">, </span>肯定是<span lang="EN-US">J2SE</span>领域中文档最及说明最缺乏的部分了<span lang="EN-US">.</span></span>
<img src ="http://www.blogjava.net/Jhonney/aggbug/187966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2008-03-23 02:57 <a href="http://www.blogjava.net/Jhonney/archive/2008/03/23/187966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>classloader</title><link>http://www.blogjava.net/Jhonney/archive/2008/03/23/187959.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Sat, 22 Mar 2008 16:19:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2008/03/23/187959.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/187959.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2008/03/23/187959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/187959.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/187959.html</trackback:ping><description><![CDATA[classloader 和class.forname的区别<br />
项目中，发生了classcast异常，源码处写的是Thread.currentThread<span class="tpc_content">.getContextClassLoader<br />
后来改成class.forname后OK啦<br />
</span>
<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;">Class.forName(String&nbsp;clz);<br />
使用调用这个语句的对象所使用的ClassLoader作为ClassLoader(</span><span style="color: #000000;">1</span><span style="color: #000000;">)。<br />
<br />
Thread.currentThread().getContextClassLoader())<br />
返回当前线程使用的ClassLoader(</span><span style="color: #000000;">2</span><span style="color: #000000;">)。<br />
<br />
<br />
如果ClassLoader(</span><span style="color: #000000;">1</span><span style="color: #000000;">)&#8220;等于&#8221;ClassLoader(</span><span style="color: #000000;">2</span><span style="color: #000000;">)，那么这里的使用Class.forName(String&nbsp;clz)和ClassLoader(</span><span style="color: #000000;">2</span><span style="color: #000000;">).loadClass(String&nbsp;clz)就是等价的。<br />
<br />
如果ClassLoader(</span><span style="color: #000000;">1</span><span style="color: #000000;">)&#8220;不等于&#8221;ClassLoader(</span><span style="color: #000000;">2</span><span style="color: #000000;">)，那么就是不等价的。<br />
<br />
在框架代码中，实际情况是ClassLoader(</span><span style="color: #000000;">1</span><span style="color: #000000;">)往往&#8220;不等于&#8221;ClassLoader(</span><span style="color: #000000;">2</span><span style="color: #000000;">)：<br />
即调用Class.forName(String&nbsp;clz)的语句所在的类的装载器不一定就是当前线程使用的类装载器。<br />
因为：一个类装载完了在运行了，该类的所属的类装载器就确定了(不变)，而在程序运行之中，线程<br />
的类装载器都随时可以通过hread.currentThread().setContextClassLoader(loader)进行改变(变)。</span></div>
程序中出现的错误，可能是由于平台的classloader是另一套机制<br />
<img src ="http://www.blogjava.net/Jhonney/aggbug/187959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2008-03-23 00:19 <a href="http://www.blogjava.net/Jhonney/archive/2008/03/23/187959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一片比较不错的单例双检锁</title><link>http://www.blogjava.net/Jhonney/archive/2008/03/13/186155.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Thu, 13 Mar 2008 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2008/03/13/186155.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/186155.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2008/03/13/186155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/186155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/186155.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: quto:http://www.ibm.com/developerworks/java/library/j-dcl.html?dwzone=java                        A comprehensive look at this broken programming idiom                                           ...&nbsp;&nbsp;<a href='http://www.blogjava.net/Jhonney/archive/2008/03/13/186155.html'>阅读全文</a><img src ="http://www.blogjava.net/Jhonney/aggbug/186155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2008-03-13 22:43 <a href="http://www.blogjava.net/Jhonney/archive/2008/03/13/186155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DELL XP Pro 来源 与 MD5</title><link>http://www.blogjava.net/Jhonney/archive/2007/12/02/164667.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Sun, 02 Dec 2007 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2007/12/02/164667.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/164667.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2007/12/02/164667.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/164667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/164667.html</trackback:ping><description><![CDATA[<p>MD5：57505544DB716B451DB6CC33F1ABC0E3<br />
2005N<br />
原始放出2006.07世纪时代论坛</p>
<p>&nbsp;</p>
<p>MD5：66c029d7c10bfb1b9ce1c7034d882a21<br />
2004N<br />
原始放出ISO：2004.09&nbsp;&nbsp; 西安交大XXX</p>
<p><br />
md5：62c244a48e70b80c6baa014ca33b68ed<br />
2006N<br />
原始放出2006.10电骡一友：Bxx xxxxx</p>
<p><br />
MD5：e38f4e392a7798aao15fa95c50ff573d<br />
和MD5：57505544DB716B451DB6CC33F1ABC0E3<br />
是同一批盘。</p>
<img src ="http://www.blogjava.net/Jhonney/aggbug/164667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2007-12-02 17:47 <a href="http://www.blogjava.net/Jhonney/archive/2007/12/02/164667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dell OEM XP SP2的原版镜像</title><link>http://www.blogjava.net/Jhonney/archive/2007/12/02/164666.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Sun, 02 Dec 2007 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2007/12/02/164666.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/164666.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2007/12/02/164666.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/164666.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/164666.html</trackback:ping><description><![CDATA[<div class="tit">Dell OEM XP SP2的原版镜像</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p>Dell OEM XP SP2的原版镜像：</p>
            <p>1.2004年台式机原版：MD5 66c029d7c10bfb1b9ce1c7034d882a21</p>
            <p>2.2005年笔记本原版：MD5 57505544DB716B451DB6CC33F1ABC0E3</p>
            <p>3.2006年原版：MD5 62c244a48e70b80c6baa014ca33b68ed</p>
            <p>非原版：</p>
            <p>1.772MB的那个所谓的2006.04版</p>
            <p>2.MD5 97E6327A45A86D62E40F38504B4BB01A<br />
            </p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/Jhonney/aggbug/164666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2007-12-02 17:45 <a href="http://www.blogjava.net/Jhonney/archive/2007/12/02/164666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随笔</title><link>http://www.blogjava.net/Jhonney/archive/2007/09/15/145389.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Sat, 15 Sep 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2007/09/15/145389.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/145389.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2007/09/15/145389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/145389.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/145389.html</trackback:ping><description><![CDATA[这一个月来一直在做专利电子审批项目,比较的忙,也没时间更新BOKEE了<br />
感受最大的是 ,在读研期间,我过多的重视了技术,醉心于技术,但是在实际的工作,项目中,软件工程/管理方面的东西却一直很没有用心,近日感觉这是个方向,基石
<img src ="http://www.blogjava.net/Jhonney/aggbug/145389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2007-09-15 16:43 <a href="http://www.blogjava.net/Jhonney/archive/2007/09/15/145389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;上帝也疯狂2&gt;</title><link>http://www.blogjava.net/Jhonney/archive/2007/09/15/145386.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Sat, 15 Sep 2007 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2007/09/15/145386.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/145386.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2007/09/15/145386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/145386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/145386.html</trackback:ping><description><![CDATA[昨天偶然看了央6的上帝也疯狂,感觉
<img src ="http://www.blogjava.net/Jhonney/aggbug/145386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2007-09-15 16:34 <a href="http://www.blogjava.net/Jhonney/archive/2007/09/15/145386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]UML学习笔记</title><link>http://www.blogjava.net/Jhonney/archive/2007/08/05/134526.html</link><dc:creator>Jhonney</dc:creator><author>Jhonney</author><pubDate>Sun, 05 Aug 2007 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/Jhonney/archive/2007/08/05/134526.html</guid><wfw:comment>http://www.blogjava.net/Jhonney/comments/134526.html</wfw:comment><comments>http://www.blogjava.net/Jhonney/archive/2007/08/05/134526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jhonney/comments/commentRss/134526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jhonney/services/trackbacks/134526.html</trackback:ping><description><![CDATA[<p>作者：Thatway (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#117;&#116;&#104;&#97;&#116;&#119;&#97;&#121;&#32;&#40;&#97;&#116;&#41;&#32;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#32;&#40;&#100;&#111;&#116;&#41;&#32;&#99;&#111;&#109;"><font color=#006699><u>mailto:outhatway (at) hotmail (dot) com</u></font></a>) <br>来自：<a href="http://www.hibernate.org.cn/" target=_blank><font color=#006699><u>http://www.hibernate.org.cn</u></font></a></p>
<p>目 录</p>
<ul>
    <li><a href="http://www.javaeye.com/21.html#A2"><font color=#006699><u>为什么重要</u></font></a>
    <li><a href="http://www.javaeye.com/21.html#A3"><font color=#006699><u>学习旅程</u></font></a>
    <ul>
        <li><a href="http://www.javaeye.com/21.html#A4"><font color=#006699><u>视图和图</u></font></a>
        <li><a href="http://www.javaeye.com/21.html#A5"><font color=#006699><u>相关资源</u></font></a>
        <li><a href="http://www.javaeye.com/21.html#A6"><font color=#006699><u>聚合、关联和引用</u></font></a></li>
    </ul>
    <li><a href="http://www.javaeye.com/21.html#A7"><font color=#006699><u>实践建议</u></font></a></li>
</ul>
<font color=#006699><u>
<hr>
</u></font><a name=A2></a>
<h2>为什么重要</h2>
<blockquote>
<p><em>您应该使用<span style="COLOR: #cc0000">UML</span>吗？一个字：是！&#8230;&#8230;新的书、文章等等将会全部以<span style="COLOR: #cc0000">UML</span>作为符号。&#8230;&#8230;如果你正要开始使用建模符号，您就应该直接学习<span style="COLOR: #cc0000">UML</span>。</em> </p>
<p><em>—— Martin Fowler 1997</em></p>
<p>统一建模语言<span style="COLOR: #cc0000">UML</span>（Unified Modeling Language）是一套用于面向对象系统建模的标准符号，在20世纪90年代几经波折，终于得到对象管理组织OMG（Object Management Group）的支持，成为业界符号系统的统一标准。</p>
<p>因此，了解它是学习后面技术的前提。这并不是夸张，在看懂（并非精通）<span style="COLOR: #cc0000">UML</span>以前，我压根没明白《设计模式》，因为《设》里面就用到象<span style="COLOR: #cc0000">UML</span>那样的语言——OMT。</p>
<p>那<span style="COLOR: #cc0000">UML</span>无疑是重要，但它能很好的胜任建模工作吗？关于这个问题，我没有能力给您一个完美的答复，相关的&#8220;讨论&#8221;也在继续，但下面的几个事实相信会给您信心。</p>
<pre class=code>1。<span style="COLOR: #cc0000">UML</span>吸取多种建模语言的优点，包括三位全球顶级方法学家的贡献。2。它在风雨中崛起，经受考验。3。<span style="COLOR: #cc0000">UML</span>得到OMG组织及其成员的支持。4。相当多的业界巨头们也在使用着它。</pre>
</blockquote>
<hr>
<a name=A3></a>
<h2>学习旅程</h2>
<blockquote>
<p><span style="COLOR: #cc0000">UML</span>体系是如此复杂，可能会让您觉得难以把握。但是我们只要有选择性的学习就足够了，剩下的当日后有需要时再深入研究。</p>
<p>在学习之前，我们先来做一个说明，<span style="COLOR: #cc0000">UML</span>仅是一门语言，学习<span style="COLOR: #cc0000">UML</span>不等同于学习系统建模，它们的关系就好比学习中文和学习文章写作那样。只是很多情况下，我们都会把它们联系在一起而已。</p>
<p>
<hr>
<p>&#160;</p>
<p><a name=A4></a>
<h3>视图和图</h3>
<p>&#160;</p>
<p>&#160;</p>
<p>那好，就让我们开始吧，先来浏览一下<span style="COLOR: #cc0000">UML</span>的全貌。由于我们很难只从一个角度去完整描述一个系统的所有方面。因此<span style="COLOR: #cc0000">UML</span>提供了以下五种视图，它们分工合作，又互相补充。</p>
<pre class=code>1)    用况视图（Use Case View）2)    设计视图（Design View）或逻辑视图（Logical View）3)    进程视图（Process View）4)    实现视图（Implementation View）或组件视图（Component View）5)    实施视图（Deployment View）</pre>
<p>而这五个视图又分别用到以下九种图中的一种或几种。</p>
<pre class=code>1)    用况图2)    类图3)    对象图4)    顺序图5)    协作图6)    状态图7)    活动图8)    构件图9)    实施图</pre>
<p>
<hr>
<p>&#160;</p>
<p><a name=A5></a>
<h3>相关资源</h3>
<p>&#160;</p>
<p>&#160;</p>
<p>好，看一下相关资源。</p>
<p>1) 《<span style="COLOR: #cc0000">UML</span>用户指南》</p>
<p>此书出自名家，只是部分翻译欠佳。阅读时弄清楚上述五个视图的概念和几种常用的图的表示即可，初次阅读不必深究。</p>
<p>2) 《<span style="COLOR: #cc0000">UML</span>和模式应用》</p>
<p>书中示范如何结合<span style="COLOR: #cc0000">UML</span>以增量方式开发一个系统，着重介绍了OO分析的技巧和法则。内容稍嫌罗嗦，但不失为一本好书。</p>
<p>3) 《<span style="COLOR: #cc0000">UML</span> Distilled》</p>
<p>另一本入门好书，作为普通使用已经足够。</p>
<p>4) 《非程序员》第二期之《用<span style="COLOR: #cc0000">UML</span>设计Java应用程序》</p>
<p>阅读这一短篇文章，可以快速了解如何在实际项目中使用<span style="COLOR: #cc0000">UML</span>。</p>
<p>5) <a href="http://www.uml.org/" target=_blank><u><font color=#006699>http://www.</font><span style="COLOR: #cc0000">uml</span><font color=#006699>.org/</font></u></a></p>
<p><span style="COLOR: #cc0000">UML</span>的官方网站，可以找到很多有用资料。</p>
<p>6) <a href="http://www.umlchina.com/" target=_blank><u><font color=#006699>http://www.</font><span style="COLOR: #cc0000">uml</span><font color=#006699>china.com/</font></u></a></p>
<p>它发行《非程序员》电子杂志和记录很多中文文档，还有一个非常活跃的讨论组。</p>
<p>7) <a href="http://www.csdn.net/develop/" target=_blank><font color=#006699><u>http://www.csdn.net/develop/</u></font></a></p>
<p>8) <a href="http://www-900.ibm.com/developerworks/cn" target=_blank><font color=#006699><u>http://www-900.ibm.com/developerworks/cn</u></font></a></p>
<p>这两个网站可以搜索到很多<span style="COLOR: #cc0000">UML</span>的中文文章，只是比较零散，不大适合系统学习。</p>
<p>&#160;</p>
<p>再来看一下<span style="COLOR: #cc0000">UML</span>工具。在这方面我没有很好的经验，且看看别人怎么说。</p>
<p>1) 《非程序员》第一期的&#8220;选择一种<span style="COLOR: #cc0000">UML</span>建模工具&#8221;介绍了评价<span style="COLOR: #cc0000">UML</span>工具的一系列标准。</p>
<p>2) <span style="COLOR: #cc0000">UML</span>官方网站资源页的&#8220;<span style="COLOR: #cc0000">UML</span> Tools&#8221;栏（链接）列出了极多的<span style="COLOR: #cc0000">UML</span>工具，可供选择。</p>
<p>
<hr>
<p>&#160;</p>
<p><a name=A6></a>
<h3>聚合、关联和引用</h3>
<p>&#160;</p>
<p>最后，我们讨论一下几个具有&#8220;争议&#8221;性的概念——聚合（Aggregation）、组合（Composition）、相识（Acquaintance）、关联（Association）、依赖（Dependence）和引用（Reference）。它们极具相似性，在代码的实现上有些甚至是完全一样的，然而从概念上理解和区分它们对我们的系统分析和设计是有重要意义的。</p>
<p>聚合是指一个对象拥有另一个对象，仅强调&#8220;拥有&#8221;。而组合是指一个对象是另一个对象的一部分，强调&#8220;不可分割&#8221;，两个对象具有相同的生命周期。两者的差别就好比创立一间公司时您可以不要雇员（拥有），但创造一个人时您却不能丢掉了他的心（不可分割）。</p>
<p>关联和依赖都是指一个对象知道另一个对象。区别在于关联是一种结构关系，表现为一个对象能够获得另一个对象的实例引用并调用它的服务（即使用它）；依赖是一种使用关系，表现为一个对象仅仅是调用了另一个对象的服务。相识既可能是关联，也可能是依赖。</p>
<p>引用是指那些指向对象的类属性。实现组合、聚合和关联时无可避免的要用到引用，但实现依赖时却不一定用到。</p>
<p>总的来说，关联和依赖是同级的；组合是一种聚合，而聚合是一种关联；引用则是相对独立的。</p>
<p>与此相关的文章有：</p>
<p>1) 《<span style="COLOR: #cc0000">UML</span>用户指南》第10章，Booch+详细讲述了依赖和关联的含义和区别。</p>
<p>2) 《设计模式》中文版第15~16页，Gof讲述了聚合和相识的差别。</p>
<p>3) 《非程序员》第二期之《类之间设置成&#8220;关联&#8221;OR&#8220;依赖&#8221;似乎全在个人喜好》是几位朋友就聚合、关联和依赖的区别进行的很好的讨论。</p>
<p>至此，如果您对它们的定义持不同意见，又或者觉得难以理解的话，不妨把别人的那一套都抛开，自己把它们重定义一遍。反正我们又不是理论家，就算定义得不科学也没关系，只要和我们的项目有关的人员都一致的理解和接受就可以了。毕竟有效的沟通才是我们真正的目的。</p>
</blockquote>
<hr>
<a name=A7></a>
<h2>实践建议</h2>
<blockquote>
<p>按需剪裁。项目要用到什么就学习什么，暂时不用的就放下。我们的目的是当前的系统建模，而不是一下子成为<span style="COLOR: #cc0000">UML</span>高手。</p>
<p>自由扩展。结合我们的实际情况，在使用的过程中，要明确<span style="COLOR: #cc0000">UML</span>的重点是&#8220;沟通&#8221;，其次才是&#8220;公共&#8221;。<span style="COLOR: #cc0000">UML</span>本身有许多规则和约定，但没必要一一遵守。只要有利于沟通的，我们就采用，否则就摒弃。通常我们的文档只是在小范围里传播，要统一理解并不困难。当然，当规则定好了后，最好就不要随意更改了。</p>
</blockquote>
<img src ="http://www.blogjava.net/Jhonney/aggbug/134526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jhonney/" target="_blank">Jhonney</a> 2007-08-05 17:02 <a href="http://www.blogjava.net/Jhonney/archive/2007/08/05/134526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>