﻿<?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-白玉成的专栏</title><link>http://www.blogjava.net/baiyucheng/</link><description>Eclipse，让我欢喜让我忧！</description><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 02:05:03 GMT</lastBuildDate><pubDate>Sat, 04 Apr 2026 02:05:03 GMT</pubDate><ttl>60</ttl><item><title>修改eclipse启动图片</title><link>http://www.blogjava.net/baiyucheng/archive/2009/04/13/265237.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Mon, 13 Apr 2009 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2009/04/13/265237.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/265237.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2009/04/13/265237.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/265237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/265237.html</trackback:ping><description><![CDATA[<p>方法1：在\plugins\org.eclipse.platform_xxxxxxxxx 目录下用想要的图片更换原有的splash.bmp即可<br />
方法2：修改启动参数：eclipse.exe -vmargs -Dosgi.splashLocation=图片路径（如 C:\picture_path\splash.bmp）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或在eclipse.ini中加入：-Dosgi.splashLocation=图片路径</p>
 <img src ="http://www.blogjava.net/baiyucheng/aggbug/265237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2009-04-13 10:53 <a href="http://www.blogjava.net/baiyucheng/archive/2009/04/13/265237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中synchronized的使用方法</title><link>http://www.blogjava.net/baiyucheng/archive/2008/12/01/243592.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Sun, 30 Nov 2008 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/12/01/243592.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/243592.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/12/01/243592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/243592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/243592.html</trackback:ping><description><![CDATA[<strong>synchronized的一个简单例子<br />
</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TextThread<br />
<img id="Codehighlighter1_26_263_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_263_Open_Text.style.display='none'; Codehighlighter1_26_263_Closed_Image.style.display='inline'; Codehighlighter1_26_263_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_26_263_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_26_263_Closed_Text.style.display='none'; Codehighlighter1_26_263_Open_Image.style.display='inline'; Codehighlighter1_26_263_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_26_263_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_30_53_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_53_Open_Text.style.display='none'; Codehighlighter1_30_53_Closed_Image.style.display='inline'; Codehighlighter1_30_53_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_30_53_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_30_53_Closed_Text.style.display='none'; Codehighlighter1_30_53_Open_Image.style.display='inline'; Codehighlighter1_30_53_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span id="Codehighlighter1_30_53_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/</span><span id="Codehighlighter1_30_53_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)<br />
<img id="Codehighlighter1_98_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_98_259_Open_Text.style.display='none'; Codehighlighter1_98_259_Closed_Image.style.display='inline'; Codehighlighter1_98_259_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_98_259_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_98_259_Closed_Text.style.display='none'; Codehighlighter1_98_259_Open_Image.style.display='inline'; Codehighlighter1_98_259_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_98_259_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;自动生成方法存根</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　TxtThread&nbsp;tt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TxtThread();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(tt).start();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(tt).start();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(tt).start();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(tt).start();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TxtThread&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Runnable<br />
<img id="Codehighlighter1_305_611_Open_Image" onclick="this.style.display='none'; Codehighlighter1_305_611_Open_Text.style.display='none'; Codehighlighter1_305_611_Closed_Image.style.display='inline'; Codehighlighter1_305_611_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_305_611_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_305_611_Closed_Text.style.display='none'; Codehighlighter1_305_611_Open_Image.style.display='inline'; Codehighlighter1_305_611_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_305_611_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;num&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　String&nbsp;str&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();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()<br />
<img id="Codehighlighter1_375_607_Open_Image" onclick="this.style.display='none'; Codehighlighter1_375_607_Open_Text.style.display='none'; Codehighlighter1_375_607_Closed_Image.style.display='inline'; Codehighlighter1_375_607_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_375_607_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_375_607_Closed_Text.style.display='none'; Codehighlighter1_375_607_Open_Image.style.display='inline'; Codehighlighter1_375_607_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_375_607_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_394_603_Open_Image" onclick="this.style.display='none'; Codehighlighter1_394_603_Open_Text.style.display='none'; Codehighlighter1_394_603_Closed_Image.style.display='inline'; Codehighlighter1_394_603_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_394_603_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_394_603_Closed_Text.style.display='none'; Codehighlighter1_394_603_Open_Image.style.display='inline'; Codehighlighter1_394_603_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_394_603_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">(str)<br />
<img id="Codehighlighter1_418_599_Open_Image" onclick="this.style.display='none'; Codehighlighter1_418_599_Open_Text.style.display='none'; Codehighlighter1_418_599_Closed_Image.style.display='inline'; Codehighlighter1_418_599_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_418_599_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_418_599_Closed_Text.style.display='none'; Codehighlighter1_418_599_Open_Image.style.display='inline'; Codehighlighter1_418_599_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_418_599_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(num</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_435_595_Open_Image" onclick="this.style.display='none'; Codehighlighter1_435_595_Open_Text.style.display='none'; Codehighlighter1_435_595_Closed_Image.style.display='inline'; Codehighlighter1_435_595_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_435_595_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_435_595_Closed_Text.style.display='none'; Codehighlighter1_435_595_Open_Image.style.display='inline'; Codehighlighter1_435_595_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_435_595_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
<img id="Codehighlighter1_445_469_Open_Image" onclick="this.style.display='none'; Codehighlighter1_445_469_Open_Text.style.display='none'; Codehighlighter1_445_469_Closed_Image.style.display='inline'; Codehighlighter1_445_469_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_445_469_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_445_469_Closed_Text.style.display='none'; Codehighlighter1_445_469_Open_Image.style.display='inline'; Codehighlighter1_445_469_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_445_469_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　Thread.sleep(</span><span style="color: #000000">10</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)<br />
<img id="Codehighlighter1_494_516_Open_Image" onclick="this.style.display='none'; Codehighlighter1_494_516_Open_Text.style.display='none'; Codehighlighter1_494_516_Closed_Image.style.display='inline'; Codehighlighter1_494_516_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_494_516_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_494_516_Closed_Text.style.display='none'; Codehighlighter1_494_516_Open_Image.style.display='inline'; Codehighlighter1_494_516_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_494_516_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　e.getMessage();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　System.out.println(Thread.currentThread().getName()</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">this&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;num</span><span style="color: #000000">--</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
上面的例子中为了制造一个时间差,也就是出错的机会,使用了Thread.sleep(10)<br />
　　Java对多线程的支持与同步机制深受大家的喜爱，似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如何？――还得对synchronized关键字的作用进行深入了解才可定论。<br />
　　总的说来，synchronized关键字可以作为函数的修饰符，也可作为函数内的语句，也就是平时说的同步方法和同步语句块。如果再细的分类，synchronized可作用于instance变量、object reference（对象引用）、static函数和class literals(类名称字面常量)身上。<br />
　　<strong>在进一步阐述之前，我们需要明确几点：<br />
</strong>　　A．无论synchronized关键字加在方法上还是对象上，它取得的锁都是对象，而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。<br />
　　B．每个对象只有一个锁（lock）与之相关联。<br />
　　C．实现同步是要很大的系统开销作为代价的，甚至可能造成死锁，所以尽量避免无谓的同步控制。<br />
　　接着来讨论synchronized用到不同地方对代码产生的影响：<br />
　　假设P1、P2是同一个类的不同对象，这个类中定义了以下几种情况的同步块或同步方法，P1、P2就都可以调用它们。<br />
　　<strong>1． 把synchronized当作函数修饰符时，示例代码如下：</strong><br />
　　Public synchronized void methodAAA()<br />
　　{<br />
　　//&#8230;.<br />
　　}<br />
　　这也就是同步方法，那这时synchronized锁定的是哪个对象呢？它锁定的是调用这个同步方法对象。也就是说，当一个对象P1在不同的线程中执行这个同步方法时，它们之间会形成互斥，达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。<br />
　　上边的示例代码等同于如下代码：<br />
　　public void methodAAA()<br />
　　{<br />
　　synchronized (this) // (1)<br />
　　{<br />
　　//&#8230;..<br />
　　}<br />
　　}<br />
　　(1)处的this指的是什么呢？它指的就是调用这个方法的对象，如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程，才可以调用P1的同步方法，而对P2而言，P1这个锁与它毫不相干，程序也可能在这种情形下摆脱同步机制的控制，造成数据混乱．<br />
<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2．同步块，示例代码如下：<br />
</strong>　　public void method3(SomeObject so)<br />
　　{<br />
　　synchronized(so)<br />
　　{<br />
　　//&#8230;..<br />
　　}<br />
　　}<br />
　　这时，锁就是so这个对象，谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时，就可以这样写程序，但当没有明确的对象作为锁，只是想让一段代码同步时，可以创建一个特殊的instance变量（它得是一个对象）来充当锁：<br />
　　class Foo implements Runnable<br />
　　{<br />
　　private byte[] lock = new byte[0]; // 特殊的instance变量<br />
　　Public void methodA()<br />
　　{<br />
　　synchronized(lock) { //&#8230; }<br />
　　}<br />
　　//&#8230;..<br />
　　}<br />
　　注：零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码：生成零长度的byte[]对象只需3条操作码，而Object lock = new Object()则需要7行操作码。<br />
　　<strong>3．将synchronized作用于static 函数，示例代码如下：<br />
</strong>　　Class Foo<br />
　　{<br />
　　public synchronized static void methodAAA() // 同步的static 函数<br />
　　{<br />
　　//&#8230;.<br />
　　}<br />
　　public void methodBBB()<br />
　　{<br />
　　synchronized(Foo.class) // class literal(类名称字面常量)<br />
　　}<br />
　　}<br />
　　代码中的methodBBB()方法是把class literal作为锁的情况，它和同步的static函数产生的效果是一样的，取得的锁很特别，是当前调用这个方法的对象所属的类（Class，而不再是由这个Class产生的某个具体对象了）。<br />
　　记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不一样，不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。<br />
　　可以推断：如果一个类中定义了一个synchronized的static函数A，也定义了一个synchronized 的instance函数B，那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时，不会构成同步，因为它们的锁都不一样。A方法的锁是Obj这个对象，而B的锁是Obj所属的那个Class。<br />
　　<strong>小结如下：<br />
</strong>　　搞清楚synchronized锁定的是哪个对象，就能帮助我们设计更安全的多线程程序。<br />
　　<strong>还有一些技巧可以让我们对共享资源的同步访问更加安全：<br />
</strong>　　1． 定义private 的instance变量+它的 get方法，而不要定义public/protected的instance变量。如果将变量定义为public，对象在外界可以绕过同步方法的控制而直接取得它，并改动它。这也是JavaBean的标准实现方式之一。<br />
　　2． 如果instance变量是一个对象，如数组或ArrayList什么的，那上述方法仍然不安全，因为当外界对象通过get方法拿到这个instance对象的引用后，又将其指向另一个对象，那么这个private变量也就变了，岂不是很危险。这个时候就需要将get方法也加上synchronized同步，并且，只返回这个private对象的clone()――这样，调用端得到的就是对象副本的引用了。
<img src ="http://www.blogjava.net/baiyucheng/aggbug/243592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-12-01 00:06 <a href="http://www.blogjava.net/baiyucheng/archive/2008/12/01/243592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MQ Java API 编程</title><link>http://www.blogjava.net/baiyucheng/archive/2008/11/27/243117.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Thu, 27 Nov 2008 15:33:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/11/27/243117.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/243117.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/11/27/243117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/243117.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/243117.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 发送器：import&nbsp;com.ibm.mq.*；public&nbsp;class&nbsp;Typesetter&nbsp;{public&nbsp;static&nbsp;void&nbsp;main（String&nbsp;args[]）&nbsp;{try{String&nbsp;hostName&nbsp;=&nbsp;"ITSOG"&nbsp;；S...&nbsp;&nbsp;<a href='http://www.blogjava.net/baiyucheng/archive/2008/11/27/243117.html'>阅读全文</a><img src ="http://www.blogjava.net/baiyucheng/aggbug/243117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-11-27 23:33 <a href="http://www.blogjava.net/baiyucheng/archive/2008/11/27/243117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 平台体系结构</title><link>http://www.blogjava.net/baiyucheng/archive/2008/11/26/242734.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Wed, 26 Nov 2008 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/11/26/242734.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/242734.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/11/26/242734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/242734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/242734.html</trackback:ping><description><![CDATA[From IBM developerworks&nbsp;&nbsp;&nbsp;<a href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecov/index.html#N10057">http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecov/index.html#N10057</a><br />
author:David Gallardo<br />
<br />
<br />
<a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 平台是一个具有一组强大服务的框架，这些服务支持插件，比如 JDT 和插件开发环境（PDE）。它由几个主要的部分构成：平台运行库、工作区、工作台、团队支持和帮助。<br />
<br />
<br />
图 10. <a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 平台体系结构 <br />
<br />
<img src="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecov/10.gif"  alt="" /> <br />
<br />
<br />
<br />
平台 <br />
<br />
平台运行库是内核，它在启动时检查已安装了哪些插件，并创建关于它们的注册表信息。为降低启动时间和资源使用，它在实际需要任何插件时才加载该插件。除了内核外，其他每样东西都是作为插件来实现的。 <br />
<br />
<br />
工作区 <br />
<br />
工作区是负责管理用户资源的插件。这包括用户创建的项目、那些项目中的文件，以及文件变更和其他资源。工作区还负责通知其他插件关于资源变更的信息，比如文件创建、删除或更改。 <br />
<br />
<br />
工作台 <br />
<br />
工作台为 <a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 提供用户界面。它是使用标准窗口工具包（SWT）和一个更高级的 API（JFace）来构建的；SWT 是 Java 的 Swing/AWT GUI API 的非标准替代者，JFace 则建立在 SWT 基础上，提供用户界面组件。 <br />
<br />
<br />
SWT 已被证明是 <a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 最具争议的部分。SWT 比 Swing 或 SWT 更紧密地映射到底层操作系统的本机图形功能，这不仅使得 SWT 更快速，而且使得 Java 程序具有更像本机应用程序的外观和感觉。使用这个新的 GUI API可能会限制 <a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 工作台的可移植性，不过针对大多数流行操作系统的 SWT 移植版本已经可用。<br />
<br />
<br />
<a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 对 SWT 的使用只会影响 <a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 自身的可移植性——使用 <a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 构建的任何 Java 应用程序都不会受到影响，除非它们使用 SWT 而不是使用 Swing/AWT。<br />
<br />
<br />
团队支持 <br />
<br />
团队支持组件负责提供版本控制和配置管理支持。它根据需要添加视图，以允许用户与所使用的任何版本控制系统（如果有的话）交互。大多数插件都不需要与团队支持组件交互，除非它们提供版本控制服务。 <br />
<br />
<br />
帮助 <br />
<br />
帮助组件具有与 <a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 平台本身相当的可扩展能力。与插件向 <a href="http://gocom.primeton.com/modules/gSpace/about_onetag.php?tagid=103&amp;tagname=Eclipse&amp;PHPSESSID=23fbaa61c9da15d4ec994fc08be54548" target="_blank">Eclipse</a> 添加功能相同，帮助提供一个附加的导航结构，允许工具以 HTML 文件的形式添加文档。<br />
<img src ="http://www.blogjava.net/baiyucheng/aggbug/242734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-11-26 10:18 <a href="http://www.blogjava.net/baiyucheng/archive/2008/11/26/242734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Netbeans版本语言设置</title><link>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242665.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Tue, 25 Nov 2008 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242665.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/242665.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/242665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/242665.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近项目要用到Netbeans，于是在网上down了Netbeans6.1，装上之后是中文版的。猜想一定是在下载的时候没有选择语言选项，所以又重新选择了English版本下载了一次。可安装的时候还是中文版。于是上网搜索了一下资料才知道可以通过配置Netbeans启动参数来改变版本语言。要想将中文版转换成英文版只需在在 IDE-HOME/etc/<font style="line-height: 1.3em">netbeans</font><wbr style="line-height: 1.3em">.conf 文件中设置 netbeans_default_options 添加启动参数：--locale en_US 即可，如下：<br />
netbeans_default_options="-J-Dorg.netbeans.modules.tomcat.autoregister.token=1225973137468 -J-Dorg.netbeans.modules.tomcat.autoregister.catalinaHome=\"D:\Tomcat6\" -J-Dcom.sun.aas.installRoot=\"D:\Program Files\glassfish-v2ur2\" -J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true&nbsp;<span style="color: red">--locale en_US </span><wbr style="line-height: 1.3em">" <br />
</p>
<img src ="http://www.blogjava.net/baiyucheng/aggbug/242665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-11-25 23:14 <a href="http://www.blogjava.net/baiyucheng/archive/2008/11/25/242665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给工程添加Nature</title><link>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242662.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Tue, 25 Nov 2008 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242662.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/242662.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/242662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/242662.html</trackback:ping><description><![CDATA[1. 编写自己的nature：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.byc.natures;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.core.resources.IProject;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.core.resources.IProjectNature;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.core.runtime.CoreException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_169_216_Open_Image" onclick="this.style.display='none'; Codehighlighter1_169_216_Open_Text.style.display='none'; Codehighlighter1_169_216_Closed_Image.style.display='inline'; Codehighlighter1_169_216_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_169_216_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_169_216_Closed_Text.style.display='none'; Codehighlighter1_169_216_Open_Image.style.display='inline'; Codehighlighter1_169_216_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_169_216_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">/**&nbsp;*/</span><span id="Codehighlighter1_169_216_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Bai&nbsp;Yucheng&nbsp;2008-4-28<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_273_564_Open_Image" onclick="this.style.display='none'; Codehighlighter1_273_564_Open_Text.style.display='none'; Codehighlighter1_273_564_Closed_Image.style.display='inline'; Codehighlighter1_273_564_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_273_564_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_273_564_Closed_Text.style.display='none'; Codehighlighter1_273_564_Open_Image.style.display='inline'; Codehighlighter1_273_564_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyProjectNature&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;IProjectNature&nbsp;</span><span id="Codehighlighter1_273_564_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;IProject&nbsp;project;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_349_367_Open_Image" onclick="this.style.display='none'; Codehighlighter1_349_367_Open_Text.style.display='none'; Codehighlighter1_349_367_Closed_Image.style.display='inline'; Codehighlighter1_349_367_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_349_367_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_349_367_Closed_Text.style.display='none'; Codehighlighter1_349_367_Open_Image.style.display='inline'; Codehighlighter1_349_367_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;configure()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;CoreException&nbsp;</span><span id="Codehighlighter1_349_367_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">do&nbsp;nothing</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_418_436_Open_Image" onclick="this.style.display='none'; Codehighlighter1_418_436_Open_Text.style.display='none'; Codehighlighter1_418_436_Closed_Image.style.display='inline'; Codehighlighter1_418_436_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_418_436_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_418_436_Closed_Text.style.display='none'; Codehighlighter1_418_436_Open_Image.style.display='inline'; Codehighlighter1_418_436_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;deconfigure()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;CoreException&nbsp;</span><span id="Codehighlighter1_418_436_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">do&nbsp;nothing</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_469_490_Open_Image" onclick="this.style.display='none'; Codehighlighter1_469_490_Open_Text.style.display='none'; Codehighlighter1_469_490_Closed_Image.style.display='inline'; Codehighlighter1_469_490_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_469_490_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_469_490_Closed_Text.style.display='none'; Codehighlighter1_469_490_Open_Image.style.display='inline'; Codehighlighter1_469_490_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;IProject&nbsp;getProject()&nbsp;</span><span id="Codehighlighter1_469_490_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;project;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_536_561_Open_Image" onclick="this.style.display='none'; Codehighlighter1_536_561_Open_Text.style.display='none'; Codehighlighter1_536_561_Closed_Image.style.display='inline'; Codehighlighter1_536_561_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_536_561_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_536_561_Closed_Text.style.display='none'; Codehighlighter1_536_561_Open_Image.style.display='inline'; Codehighlighter1_536_561_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setProject(IProject&nbsp;iproject)&nbsp;</span><span id="Codehighlighter1_536_561_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;project&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;iproject;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
2. 添加扩展点：org.eclipse.core.resources.natures，设置class属性为我们的nature<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="com.byc.MyProjectNature"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="Project&nbsp;Nature"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point</span><span style="color: #0000ff">="org.eclipse.core.resources.natures"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">runtime</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">run<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.byc.natures.MyProjectNature"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">run</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">runtime</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
3. 在新建工程的向导中添加我们的nature，添加方法为：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_69_567_Open_Image" onclick="this.style.display='none'; Codehighlighter1_69_567_Open_Text.style.display='none'; Codehighlighter1_69_567_Closed_Image.style.display='inline'; Codehighlighter1_69_567_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_69_567_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_69_567_Closed_Text.style.display='none'; Codehighlighter1_69_567_Open_Image.style.display='inline'; Codehighlighter1_69_567_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;addProjectNature(IProject&nbsp;project)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;CoreException&nbsp;</span><span id="Codehighlighter1_69_567_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_114_564_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_564_Open_Text.style.display='none'; Codehighlighter1_114_564_Closed_Image.style.display='inline'; Codehighlighter1_114_564_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_114_564_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_114_564_Closed_Text.style.display='none'; Codehighlighter1_114_564_Open_Image.style.display='inline'; Codehighlighter1_114_564_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">project.hasNature(PROJECT_NATURE))&nbsp;</span><span id="Codehighlighter1_114_564_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_123_504_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_504_Open_Text.style.display='none'; Codehighlighter1_123_504_Closed_Image.style.display='inline'; Codehighlighter1_123_504_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_123_504_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_504_Closed_Text.style.display='none'; Codehighlighter1_123_504_Open_Image.style.display='inline'; Codehighlighter1_123_504_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_123_504_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;IProjectDescription&nbsp;description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;project.getDescription();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;natures&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;description.getNatureIds();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;newNatures&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[natures.length&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(natures,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;newNatures,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;natures.length);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;newNatures[natures.length]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PROJECT_NATURE;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;description.setNatureIds(newNatures);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;project.setDescription(description,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_530_560_Open_Image" onclick="this.style.display='none'; Codehighlighter1_530_560_Open_Text.style.display='none'; Codehighlighter1_530_560_Closed_Image.style.display='inline'; Codehighlighter1_530_560_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_530_560_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_530_560_Closed_Text.style.display='none'; Codehighlighter1_530_560_Open_Image.style.display='inline'; Codehighlighter1_530_560_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(CoreException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_530_560_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span></div>
 <img src ="http://www.blogjava.net/baiyucheng/aggbug/242662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-11-25 22:57 <a href="http://www.blogjava.net/baiyucheng/archive/2008/11/25/242662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMF基础知识积累</title><link>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242657.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Tue, 25 Nov 2008 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242657.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/242657.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/242657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/242657.html</trackback:ping><description><![CDATA[在项目中用到EMF积累的一些基础知识，希望对大家有所帮助。<br />
<br />
&nbsp; <span lang="EN-US">1. EMF core </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除了生成</span><span lang="EN-US">model</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">model implementation</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">外，至少还生成两个接口：</span><span lang="EN-US">*Factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">*Package</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。其中</span><span lang="EN-US">, Factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：生成实例的工厂；</span><span lang="EN-US">Package</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：提供一些静态的</span><span lang="EN-US">constants</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（例如：被用来生成方法的</span><span lang="EN-US">feature constants<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）和一些访问模型元数据的公用方法。</span>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2. EMF</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成的方法都带有&#8220;</span><span lang="EN-US">@generated</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;标签。</span><span lang="EN-US">EMF</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重新生成代码时不会覆盖用户添加的方法（不带有</span><span lang="EN-US">@generated</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">3. </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang="EN-US">Uniform Resource Identifier</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US">EMF </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中是通过</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来标识</span><span lang="EN-US">package</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，并且通过</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来唯一的确定</span><span lang="EN-US">resources</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包括三个部分：</span><span lang="EN-US">a scheme, a scheme-specific part</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">an optional fragment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US">scheme</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要决定了访问</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">资源的协议；比如：</span><span lang="EN-US">Platform:/resource/&#8230;&#8230;</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">platform</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US">scheme-specific part</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包含一些</span><span lang="EN-US">authority, device</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和一些</span><span lang="EN-US">segments</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如</span><span lang="EN-US">file:/c:/dir1/dir2/myfile.xml</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">file</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是协议，没有</span><span lang="EN-US">authority</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">c:</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span><span lang="EN-US">device,</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">剩下的</span><span lang="EN-US">3</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个是</span><span lang="EN-US">segments</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US">URI fragment </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标识了</span><span lang="EN-US">resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内部的某个具体的内容。如：</span><span lang="EN-US">file:/c:/dir1/dir2/myfile.xml#loc</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">#loc</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US"> EMF</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过带有</span><span lang="EN-US">fragment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来访问资源中的</span><span lang="EN-US">EObjects</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">4. </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span><span lang="EN-US">URIConverter</span></p>
<p class="MsoNormal"><span lang="EN-US">URIConverter</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的作用是</span><span lang="EN-US">normalize</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个输入</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，使之成为一个实际的针对某个</span><span lang="EN-US">resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。它可以把</span><span lang="EN-US">namespace URIs</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（比如：</span><span lang="EN-US">http:///com/example/epo2.ecore</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）映射到物理文件的</span><span lang="EN-US">URIs, </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者重定向旧的（或别名）的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参考到一个具体的实际的</span><span lang="EN-US">location</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。一个</span><span lang="EN-US">URIConverter</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">维护一个</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的映射集合。比如，把一个命名空间</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射到物理文件：</span></p>
<p class="MsoNormal"><span lang="EN-US">URIConverter converter = new URIConverterImpl();</span></p>
<p class="MsoNormal"><span lang="EN-US">URI uri1 = URI.createURI("http:///somemodel.ecore");</span></p>
<p class="MsoNormal"><span lang="EN-US">URI uri2 =URI.createURI("platform:/resource/project/somemodel.ecore");</span></p>
<p class="MsoNormal"><span lang="EN-US">converter.getURIMap().put(uri1, uri2);</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在如下面代码：</span></p>
<p class="MsoNormal"><span lang="EN-US">URI normalized = converter.normalize(uri1);</span></p>
<p class="MsoNormal"><span lang="EN-US">System.out.println(normalized);</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打印的结果是：</span><span lang="EN-US">platform:/resource/project/somemodel.ecore</span></p>
<p class="MsoNormal"><span lang="EN-US">URIConverter.normalize()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法只是简单的通过映射的</span><span lang="EN-US">map</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把</span><span lang="EN-US">key</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替换成了相应的</span><span lang="EN-US">value</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span lang="EN-US">URIConverter</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的最原始是应用在</span><span lang="EN-US">resource sets</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，用来定位</span><span lang="EN-US">resources.</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">5. </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">ResourceSet</span></p>
<p class="MsoNormal"><span lang="EN-US">Resource </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示一个持久化的</span><span lang="EN-US">EOjbects</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的容器；</span><span lang="EN-US">ResourceSet</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示一组</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的集合，集合中的</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同时创建或加载。</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中比较重要的就是</span><span lang="EN-US">save</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">load</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，还有通过</span><span lang="EN-US">URI fragments</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问资源中的</span><span lang="EN-US">Object</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的机制，如：</span></p>
<p class="MsoNormal"><span lang="EN-US">Resource resource =&#8230;</span></p>
<p class="MsoNormal"><span lang="EN-US">Item item = (Item)resource.getEObject("//@orders.0/@items.2");</span></p>
<p class="MsoNormal"><span lang="EN-US">Item item =&#8230;</span></p>
<p class="MsoNormal"><span lang="EN-US">String fragment = resource.getURIFragment(item);</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面代码中的两个方法，</span><span lang="EN-US">getEObject</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过带有</span><span lang="EN-US">fregment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得一个</span><span lang="EN-US">EObject</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，与之相反的方法</span><span lang="EN-US">getURIFragment()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</span><span lang="EN-US">EObject</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得相应的</span><span lang="EN-US">fragment path</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span lang="EN-US">ResourceSet</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中有些重要的方法：</span></p>
<p class="MsoNormal"><span lang="EN-US">createResource()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建一个空的</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span></p>
<p class="MsoNormal"><span lang="EN-US">getResource()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</span><span lang="EN-US">resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来创建</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span></p>
<p class="MsoNormal"><span lang="EN-US">getEObject()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，通过</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">fregment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来获得具体的</span><span lang="EN-US">EObject</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">6. </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span><span lang="EN-US">Resource.Factory</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用来创建</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">resource factory </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要注册到</span><span lang="EN-US">Registry</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例中。一个</span><span lang="EN-US">factory </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以通过多种方式的</span><span lang="EN-US">URIs</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来注册，包括</span><span lang="EN-US">URI scheme</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">extension</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在插件方式的应用中，通过扩展点的方式在插件加载的时候注册</span><span lang="EN-US">descriptor</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。下面是</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的源代码</span></p>
<p class="MsoNormal"><span lang="EN-US">public interface Resource extends Notifier</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">interface Factory</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">Resource createResource(URI uri);</span></p>
<p class="MsoNormal"><span lang="EN-US">interface Descriptor</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">Factory createFactory();</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">interface Registry</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">Factory getFactory(URI uri);</span></p>
<p class="MsoNormal"><span lang="EN-US">Map getProtocolToFactoryMap();</span></p>
<p class="MsoNormal"><span lang="EN-US">String DEFAULT_EXTENSION = "*";</span></p>
<p class="MsoNormal"><span lang="EN-US">Map getExtensionToFactoryMap();</span></p>
<p class="MsoNormal"><span lang="EN-US">Registry INSTANCE = new ResourceFactoryRegistryImpl</span></p>
<p class="MsoNormal"><span lang="EN-US">();</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面是</span><span lang="EN-US">Registry</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">getFactory()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法的算法（引用原文）：</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">1. Check for a factory in the protocolToFactoryMap, using</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">the scheme of the URI.</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">2. If nothing was found, check the extensionToFactoryMap</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">using the file extension of the URI.</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">3. If still nothing was found, check the</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">extensionToFactoryMap using the DEFAULT_EXTENSION</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">(that is, the wildcard character "*").</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">4. If no extension match was found, call the</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">delegatedGetFactory() method. This allows you to supply</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">your own factory registry, with its own lookup</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">criteria.</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">5. If a descriptor was found, instead of an actual</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">factory, call the createFactory() method on the</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">descriptor to create the factory.</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">6. Finally, return the factory if one was found, or null.</span></p>
<p class="MsoNormal"><span lang="EN-US">tip</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang="EN-US">emf</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺省的序列化方式是</span><span lang="EN-US">XMI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。因此，如果没有找到相应注册的</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺省的就会返回以</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册的缺省的</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这个</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是针对</span><span lang="EN-US">XMI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，即</span><span lang="EN-US">XMIResourceFactoryImpl</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如，对于</span><span lang="EN-US">XMIResourceFactoryImpl</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的扩展点声明</span><span lang="EN-US">:</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;extension point = "org.eclipse.emf.ecore.extension_parser"&gt;</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;parser type="*" class="org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl"/&gt;</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;/extension&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当非插件应用的时候，可以通过手工的方式来注册</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如：</span></p>
<p class="MsoNormal"><span lang="EN-US">Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put</span></p>
<p class="MsoNormal"><span lang="EN-US">("*", new XMIResourceFactoryImpl());</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">7. Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过两种方式实现</span><span lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">XMI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span lang="EN-US">1) XML</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存储的重要方法是</span><span lang="EN-US">save, </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只有在方法</span><span lang="EN-US">eIsSet()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</span><span lang="EN-US">true</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，相关的属性和引用才会被序列化到</span><span lang="EN-US">xml</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中。对于存储的</span><span lang="EN-US">xml</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的格式可以通过设置</span><span lang="EN-US">OPTION_XML_MAP</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性来完成，如下面原文：</span></p>
<p class="MsoNormal"><em><span lang="EN-US">There are several reasons why you might want to use </span></em><span lang="EN-US">OPTION_XML_MAP <em>when saving a resource:<o:p></o:p></em></span></p>
<p class="MsoNormal"><span lang="EN-US">1. <em>You want to save your data so that it conforms to a particular XML Schema.<o:p></o:p></em></span></p>
<p class="MsoNormal"><span lang="EN-US">2. <em>You have changed your model, and you want the resource to produce XML documents that will work with the old version of the model.<o:p></o:p></em></span></p>
<p class="MsoNormal"><span lang="EN-US">3. <em>You want to design your own XML format without changing your model.<o:p></o:p></em></span></p>
<p class="MsoNormal"><span lang="EN-US">2) XMI</span></p>
<p class="MsoNormal"><span lang="EN-US">XMI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基本相同，</span><span lang="EN-US">XMIResourceImpl</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是</span></p>
<p class="MsoNormal"><span lang="EN-US">XMLResourceImpl</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的简单继承，只是在引用</span><span lang="EN-US">objects</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时使用</span><span lang="EN-US">XMI IDs</span></p>
<img src ="http://www.blogjava.net/baiyucheng/aggbug/242657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-11-25 22:26 <a href="http://www.blogjava.net/baiyucheng/archive/2008/11/25/242657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>删除默认的工具栏选项</title><link>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242655.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Tue, 25 Nov 2008 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242655.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/242655.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/242655.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/242655.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">extension&nbsp;</span><span style="color: #ff0000">point</span><span style="color: #0000ff">="org.eclipse.gmf.runtime.diagram.ui.paletteProviders"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">paletteProvider&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.eclipse.gmf.runtime.diagram.ui.providers.DefaultPaletteProvider"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Priority&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="High"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">contribution</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">predefinedEntry&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="standardGroup/zoomInTool"</span><span style="color: #ff0000">&nbsp;remove</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">predefinedEntry<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="standardGroup/zoomOutTool"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">predefinedEntry</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">predefinedEntry&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="standardGroup/noteStack/noteTool"</span><span style="color: #ff0000">&nbsp;remove</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">predefinedEntry&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="standardGroup/noteStack/textTool"</span><span style="color: #ff0000">&nbsp;remove</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">predefinedEntry&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="standardGroup/noteStack/noteattachmentTool"</span><span style="color: #ff0000">&nbsp;remove</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">contribution</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">editor<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="dbdesigner.diagram.part.DbdesignerDiagramEditorID"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">editor</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">paletteProvider</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">extension</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<img src ="http://www.blogjava.net/baiyucheng/aggbug/242655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-11-25 22:13 <a href="http://www.blogjava.net/baiyucheng/archive/2008/11/25/242655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为图形增加Decoration</title><link>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242651.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Tue, 25 Nov 2008 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242651.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/242651.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/242651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/242651.html</trackback:ping><description><![CDATA[&nbsp;<span style="font-family: Arial">Decoration </span><span style="font-family: Arial">Service</span><span style="font-family: 宋体">是</span><span style="font-family: Arial">GMF Runtime</span><span style="font-family: 宋体">提供的一个</span><span style="font-family: Arial">Service</span><span style="font-family: 宋体">。它的目的是为已有图形添加修饰，它并不需要已有图形的任何信息，</span><span style="font-family: Arial">icon</span><span style="font-family: 宋体">或</span><span style="font-family: Arial">figure</span><span style="font-family: 宋体">都可以作为</span><span style="font-family: Arial">decoration</span><span style="font-family: 宋体">加到图形上。要为图形添加</span><span style="font-family: Arial">Decoration</span><span style="font-family: 宋体">，首先要编写一个</span><span style="font-family: Arial">Decorator</span><span style="font-family: 宋体">类。它可以继承</span><span style="font-family: Arial">AbstractDecorator</span><span style="font-family: 宋体">，为了满足要求我们要重写其中两个方法：</span><span style="font-family: Arial">activate()</span><span style="font-family: 宋体">、</span><span style="font-family: Arial">refresh ()</span><span style="font-family: 宋体">。</span><span style="font-family: Arial">activate</span><span style="font-family: 宋体">方法主要功能是激活</span><span style="font-family: Arial">Decorator</span><span style="font-family: 宋体">，一般只需调用</span><span style="font-family: Arial">refresh</span><span style="font-family: 宋体">方法即可。</span><span style="font-family: Arial">Refresh</span><span style="font-family: 宋体">负责当</span><span style="font-family: Arial">decorator target</span><span style="font-family: 宋体">变化时刷新</span><span style="font-family: Arial">Decorator</span><span style="font-family: 宋体">，即保持二者之间的同步。在这里我们就可以设置自己的</span><span style="font-family: Arial">Decoration</span><span style="font-family: 宋体">（如自定义的</span><span style="font-family: Arial">icon</span><span style="font-family: 宋体">或</span><span style="font-family: Arial">figure</span><span style="font-family: 宋体">）。如果想实现</span><span style="font-family: Arial">Decoration</span><span style="font-family: 宋体">动态响应模型的改变，我们可以让</span><span style="font-family: Arial">Decorator</span><span style="font-family: 宋体">实现</span><span style="font-family: Arial">NotificationListener</span><span style="font-family: 宋体">接口，这样我们就可以监听模型的改变了。实现</span><span style="font-family: Arial">notifyChanged</span><span style="font-family: 宋体">方法，在此方法中根据需求为模型添加监听器。做完</span><span style="font-family: Arial">Decorator</span><span style="font-family: 宋体">之后，我们就要为这个</span><span style="font-family: Arial">Decorator</span><span style="font-family: 宋体">编写一个</span><span style="font-family: Arial">Provider,</span><span style="font-family: 宋体">它需继承</span><span style="font-family: Arial">AbstractProvider</span><span style="font-family: 宋体">并实现</span><span style="font-family: Arial">IDecoratorProvider</span><span style="font-family: 宋体">接口。然后实现</span><span style="font-family: Arial">createDecorators</span><span style="font-family: 宋体">、</span><span style="font-family: Arial">provides</span><span style="font-family: 宋体">两个方法。在</span><span style="font-family: Arial">createDecorators</span><span style="font-family: 宋体">方法中安装我们的</span><span style="font-family: Arial">Decorator</span><span style="font-family: 宋体">。</span>
<p><span style="font-family: Arial">Provides</span><span style="font-family: 宋体">中判断添加</span><span style="font-family: Arial">Decorator</span><span style="font-family: 宋体">的条件。最后就要注册我们的</span><span style="font-family: Arial">Provider</span><span style="font-family: 宋体">了。添加扩展点：</span></p>
<span style="font-size: 10.5pt; font-family: Arial">org.eclipse.gmf.runtime.diagram.ui.decorator.providers</span><span style="font-size: 10.5pt; font-family: 宋体">，将</span><span style="font-size: 10.5pt; font-family: Arial">decoration provider</span><span style="font-size: 10.5pt; font-family: 宋体">设成我们的</span><span style="font-size: 10.5pt; font-family: Arial">Provider</span><span style="font-size: 10.5pt; font-family: 宋体">，至此大功造成！</span>
<img src ="http://www.blogjava.net/baiyucheng/aggbug/242651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-11-25 22:11 <a href="http://www.blogjava.net/baiyucheng/archive/2008/11/25/242651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式基础知识</title><link>http://www.blogjava.net/baiyucheng/archive/2008/11/24/242360.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Mon, 24 Nov 2008 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/11/24/242360.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/242360.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/11/24/242360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/242360.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/242360.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。如： <br />
<div class="tablediv">
<table cellspacing="0" border="1">
    <tbody>
        <tr valign="top">
            <th width="30%">JScript</th>
            <th width="30%">VBScript</th>
            <th width="40%">匹配</th>
        </tr>
        <tr valign="top">
            <td width="30%">/^\[ \t]*$/</td>
            <td width="30%">"^\[ \t]*$"</td>
            <td width="40%">匹配一个空白行。</td>
        </tr>
        <tr valign="top">
            <td width="30%">/\d{2}-\d{5}/</td>
            <td width="30%">"\d{2}-\d{5}"</td>
            <td width="40%">验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。</td>
        </tr>
        <tr valign="top">
            <td width="30%">/&lt;(.*)&gt;.*&lt;\/\1&gt;/</td>
            <td width="30%">"&lt;(.*)&gt;.*&lt;\/\1&gt;"</td>
            <td width="40%">匹配一个 HTML 标记。</td>
        </tr>
    </tbody>
</table>
</div>
<br />
下表是元字符及其在正则表达式上下文中的行为的一个完整列表：<br />
<table cellspacing="0" border="1">
    <tbody>
        <tr valign="top">
            <th width="16%">字符</th>
            <th width="84%">描述</th>
        </tr>
        <tr valign="top">
            <td width="16%">\</td>
            <td width="84%">将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。</td>
        </tr>
        <tr valign="top">
            <td width="16%">^</td>
            <td width="84%">匹配输入字符串的开始位置。如果设置了 <strong>RegExp</strong> 对象的 <strong>Multiline</strong> 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。</td>
        </tr>
        <tr valign="top">
            <td width="16%">$</td>
            <td width="84%">匹配输入字符串的结束位置。如果设置了<strong>RegExp</strong> 对象的 <strong>Multiline</strong> 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。</td>
        </tr>
        <tr valign="top">
            <td width="16%">*</td>
            <td width="84%">匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。</td>
        </tr>
        <tr valign="top">
            <td width="16%">+</td>
            <td width="84%">匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。</td>
        </tr>
        <tr valign="top">
            <td width="16%">?</td>
            <td width="84%">匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。</td>
        </tr>
        <tr valign="top">
            <td width="16%">{<em>n</em>}</td>
            <td width="84%"><em>n</em> 是一个非负整数。匹配确定的 <em>n</em> 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。</td>
        </tr>
        <tr valign="top">
            <td width="16%">{<em>n</em>,}</td>
            <td width="84%"><em>n</em> 是一个非负整数。至少匹配<em>n</em> 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</td>
        </tr>
        <tr valign="top">
            <td width="16%">{<em>n</em>,<em>m</em>}</td>
            <td width="84%"><em>m</em> 和 <em>n</em> 均为非负整数，其中<em>n</em> &lt;= <em>m</em>。最少匹配 <em>n</em> 次且最多匹配 <em>m</em> 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</td>
        </tr>
        <tr valign="top">
            <td width="16%">?</td>
            <td width="84%">当该字符紧跟在任何一个其他限制符 (*, +, ?, {<em>n</em>}, {<em>n</em>,}, {<em>n</em>,<em>m</em>}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。</td>
        </tr>
        <tr valign="top">
            <td width="16%">.</td>
            <td width="84%">匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。</td>
        </tr>
        <tr valign="top">
            <td width="16%">(<em>pattern</em>)</td>
            <td width="84%">匹配 <em>pattern</em> 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 <strong>SubMatches</strong> 集合，在JScript 中则使用 <strong>$0</strong>&#8230;<strong>$9</strong> 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。</td>
        </tr>
        <tr valign="top">
            <td width="16%">(?:<em>pattern</em>)</td>
            <td width="84%">匹配 <em>pattern</em> 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。</td>
        </tr>
        <tr valign="top">
            <td width="16%">(?=<em>pattern</em>)</td>
            <td width="84%">正向预查，在任何匹配 <em>pattern</em> 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</td>
        </tr>
        <tr valign="top">
            <td width="16%">(?!<em>pattern</em>)</td>
            <td width="84%">负向预查，在任何不匹配 <em>pattern</em> 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始 </td>
        </tr>
        <tr valign="top">
            <td width="16%"><em>x</em>|<em>y</em></td>
            <td width="84%">匹配 <em>x</em> 或 <em>y</em>。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。</td>
        </tr>
        <tr valign="top">
            <td width="16%">[<em>xyz</em>]</td>
            <td width="84%">字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。</td>
        </tr>
        <tr valign="top">
            <td width="16%">[^<em>xyz</em>]</td>
            <td width="84%">负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。</td>
        </tr>
        <tr valign="top">
            <td width="16%">[<em>a-z</em>]</td>
            <td width="84%">字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。</td>
        </tr>
        <tr valign="top">
            <td width="16%">[^<em>a-z</em>]</td>
            <td width="84%">负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\b</td>
            <td width="84%">匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\B</td>
            <td width="84%">匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\c<em>x</em></td>
            <td width="84%">匹配由 <em>x </em>指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。<em>x</em> 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\d</td>
            <td width="84%">匹配一个数字字符。等价于 [0-9]。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\D</td>
            <td width="84%">匹配一个非数字字符。等价于 [^0-9]。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\f</td>
            <td width="84%">匹配一个换页符。等价于 \x0c 和 \cL。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\n</td>
            <td width="84%">匹配一个换行符。等价于 \x0a 和 \cJ。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\r</td>
            <td width="84%">匹配一个回车符。等价于 \x0d 和 \cM。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\s</td>
            <td width="84%">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [&nbsp;\f\n\r\t\v]。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\S</td>
            <td width="84%">匹配任何非空白字符。等价于 [^&nbsp;\f\n\r\t\v]。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\t</td>
            <td width="84%">匹配一个制表符。等价于 \x09 和 \cI。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\v</td>
            <td width="84%">匹配一个垂直制表符。等价于 \x0b 和 \cK。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\w</td>
            <td width="84%">匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\W</td>
            <td width="84%">匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\x<em>n</em></td>
            <td width="84%">匹配 <em>n</em>，其中 <em>n</em> 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。.</td>
        </tr>
        <tr valign="top">
            <td width="16%">\<em>num</em></td>
            <td width="84%">匹配 <em>num</em>，其中 <em>num</em> 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\<em>n</em></td>
            <td width="84%">标识一个八进制转义值或一个向后引用。如果 \<em>n</em> 之前至少 <em>n</em> 个获取的子表达式，则 <em>n</em> 为向后引用。否则，如果 <em>n</em> 为八进制数字 (0-7)，则 <em>n</em> 为一个八进制转义值。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\<em>nm</em></td>
            <td width="84%">标识一个八进制转义值或一个向后引用。如果 \<em>nm</em> 之前至少有 <em>nm</em> 个获得子表达式，则 <em>nm</em> 为向后引用。如果 \<em>nm</em> 之前至少有 <em>n</em> 个获取，则 <em>n</em> 为一个后跟文字 <em>m </em>的向后引用。如果前面的条件都不满足，若 <em>n</em> 和 <em>m</em> 均为八进制数字 (0-7)，则 \<em>nm</em> 将匹配八进制转义值 <em>nm</em>。</td>
        </tr>
        <tr valign="top">
            <td width="16%">\<em>nml</em></td>
            <td width="84%">如果 <em>n</em> 为八进制数字 (0-3)，且 <em>m</em> 和 <em>l</em> 均为八进制数字 (0-7)，则匹配八进制转义值 <em>nml。</em></td>
        </tr>
        <tr valign="top">
            <td width="16%">\u<em>n</em></td>
            <td width="84%">匹配 <em>n</em>，其中 <em>n</em> 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (&#169;)。</td>
        </tr>
    </tbody>
</table>
<p><br />
下面看几个例子：<br />
"^The"：表示所有以"The"开始的字符串（"There"，"The cat"等）； <br />
"of despair$"：表示所以以"of despair"结尾的字符串； <br />
"^abc$"：表示开始和结尾都是"abc"的字符串——呵呵，只有"abc"自己了； <br />
"notice"：表示任何包含"notice"的字符串。 <br />
<br />
'*'，'+'和'?'这三个符号，表示一个或一序列字符重复出现的次数。它们分别表示&#8220;没有或 <br />
更多&#8221;，&#8220;一次或更多&#8221;还有&#8220;没有或一次&#8221;。下面是几个例子： </p>
<p>"ab*"：表示一个字符串有一个a后面跟着零个或若干个b。（"a", "ab", "abbb",&#8230;&#8230;）； <br />
"ab+"：表示一个字符串有一个a后面跟着至少一个b或者更多； <br />
"ab?"：表示一个字符串有一个a后面跟着零个或者一个b； <br />
"a?b+$"：表示在字符串的末尾有零个或一个a跟着一个或几个b。 </p>
<p>也可以使用范围，用大括号括起，用以表示重复次数的范围。 </p>
<p>"ab{2}"：表示一个字符串有一个a跟着2个b（"abb"）； <br />
"ab{2,}"：表示一个字符串有一个a跟着至少2个b； <br />
"ab{3,5}"：表示一个字符串有一个a跟着3到5个b。 </p>
<p>请注意，你必须指定范围的下限（如："{0,2}"而不是"{,2}"）。还有，你可能注意到了，'*'，'+'和 <br />
'?'相当于"{0,}"，"{1,}"和"{0,1}"。 <br />
还有一个'&#166;'，表示&#8220;或&#8221;操作： </p>
<p>"hi&#166;hello"：表示一个字符串里有"hi"或者"hello"； <br />
"(b&#166;cd)ef"：表示"bef"或"cdef"； <br />
"(a&#166;b)*c"：表示一串"a""b"混合的字符串后面跟一个"c"； </p>
<p>'.'可以替代任何字符： </p>
<p>"a.[0-9]"：表示一个字符串有一个"a"后面跟着一个任意字符和一个数字； <br />
"^.{3}$"：表示有任意三个字符的字符串（长度为3个字符）； </p>
<p>方括号表示某些字符允许在一个字符串中的某一特定位置出现： </p>
<p>"[ab]"：表示一个字符串有一个"a"或"b"（相当于"a&#166;b"）； <br />
"[a-d]"：表示一个字符串包含小写的'a'到'd'中的一个（相当于"a&#166;b&#166;c&#166;d"或者"[abcd]"）； <br />
"^[a-zA-Z]"：表示一个以字母开头的字符串； <br />
"[0-9]%"：表示一个百分号前有一位的数字； <br />
",[a-zA-Z0-9]$"：表示一个字符串以一个逗号后面跟着一个字母或数字结束。 </p>
<p>你也可以在方括号里用'^'表示不希望出现的字符，'^'应在方括号里的第一位。（如："%[^a-zA-Z]%"表 <br />
示两个百分号中不应该出现字母）。 </p>
<p>为了逐字表达，必须在"^.$()&#166;*+?{\"这些字符前加上转移字符'\'。 </p>
<p>请注意在方括号中，不需要转义字符。</p>
<img src ="http://www.blogjava.net/baiyucheng/aggbug/242360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-11-24 20:47 <a href="http://www.blogjava.net/baiyucheng/archive/2008/11/24/242360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>