??xml version="1.0" encoding="utf-8" standalone="yes"?>成人免费一区二区三区视频,国产精品三区在线,久久综合电影一区http://www.aygfsteel.com/baiyucheng/EclipseQ让我欢喜让我忧Q?/description>zh-cnSun, 18 May 2025 03:59:10 GMTSun, 18 May 2025 03:59:10 GMT60修改eclipse启动囄http://www.aygfsteel.com/baiyucheng/archive/2009/04/13/265237.html白玉?/dc:creator>白玉?/author>Mon, 13 Apr 2009 02:53:00 GMThttp://www.aygfsteel.com/baiyucheng/archive/2009/04/13/265237.htmlhttp://www.aygfsteel.com/baiyucheng/comments/265237.htmlhttp://www.aygfsteel.com/baiyucheng/archive/2009/04/13/265237.html#Feedback1http://www.aygfsteel.com/baiyucheng/comments/commentRss/265237.htmlhttp://www.aygfsteel.com/baiyucheng/services/trackbacks/265237.htmlҎ1Q在\plugins\org.eclipse.platform_xxxxxxxxx 目录下用惌的图片更换原有的splash.bmp卛_
Ҏ2Q修改启动参敎ͼeclipse.exe -vmargs -Dosgi.splashLocation=囄路径Q如 C:\picture_path\splash.bmpQ?br />               或在eclipse.ini中加入:-Dosgi.splashLocation=囄路径



]]>
Java中synchronized的用方?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/baiyucheng/archive/2008/12/01/243592.html</guid><wfw:comment>http://www.aygfsteel.com/baiyucheng/comments/243592.html</wfw:comment><comments>http://www.aygfsteel.com/baiyucheng/archive/2008/12/01/243592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/baiyucheng/comments/commentRss/243592.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> 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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  * </span><span style="color: #808080">@param</span><span style="color: #008000"> args<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />  </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] 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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />  </span><span id="Codehighlighter1_98_259_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #008000">//</span><span style="color: #008000"> TODO 自动生成Ҏ存根</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">  TxtThread tt </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> TxtThread();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">new</span><span style="color: #000000"> Thread(tt).start();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">new</span><span style="color: #000000"> Thread(tt).start();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">new</span><span style="color: #000000"> Thread(tt).start();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">new</span><span style="color: #000000"> Thread(tt).start();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />  }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />  }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />  </span><span style="color: #0000ff">class</span><span style="color: #000000"> TxtThread </span><span style="color: #0000ff">implements</span><span style="color: #000000"> 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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" />  </span><span id="Codehighlighter1_305_611_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">int</span><span style="color: #000000"> num </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">100</span><span style="color: #000000">;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  String str </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> String();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> 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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />  </span><span id="Codehighlighter1_375_607_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">while</span><span style="color: #000000"> (</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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />  </span><span id="Codehighlighter1_394_603_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />  </span><span id="Codehighlighter1_418_599_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">if</span><span style="color: #000000"> (num</span><span style="color: #000000">></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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />  </span><span id="Codehighlighter1_435_595_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />  </span><span id="Codehighlighter1_445_469_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />  }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  </span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception 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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />  </span><span id="Codehighlighter1_494_516_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  e.getMessage();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />  }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />  System.out.println(Thread.currentThread().getName()</span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">this is </span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000"> num</span><span style="color: #000000">--</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />  }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />  }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />  }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />  }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />  }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <br /> 上面的例子中Z刉一个时间差,也就是出错的Z,使用了Thread.sleep(10)<br />   Java对多U程的支持与同步机制深受大家的喜爱,g看v来用了synchronized关键字就可以L地解军_U程׃n数据同步问题。到底如何?――还得对synchronized关键字的作用q行深入了解才可定论?br />   ȝ说来Qsynchronized关键字可以作为函数的修饰W,也可作ؓ函数内的语句Q也是qx说的同步Ҏ和同步语句块。如果再l的分类Qsynchronized可作用于instance变量、object referenceQ对象引用)、static函数和class literals(cdU字面常?w上?br />   <strong>在进一步阐qC前,我们需要明几点:<br /> </strong>  AQ无论synchronized关键字加在方法上q是对象上,它取得的锁都是对象,而不是把一D代码或函数当作锁――而且同步Ҏ很可能还会被其他U程的对象访问?br />   BQ每个对象只有一个锁QlockQ与之相兌?br />   CQ实现同步是要很大的pȝ开销作ؓ代h的,甚至可能造成死锁Q所以尽量避免无谓的同步控制?br />   接着来讨论synchronized用到不同地方对代码生的影响Q?br />   假设P1、P2是同一个类的不同对象,q个cM定义了以下几U情늚同步块或同步ҎQP1、P2都可以调用它们?br />   <strong>1Q?把synchronized当作函数修饰W时Q示例代码如下:</strong><br />   Public synchronized void methodAAA()<br />   {<br />   //….<br />   }<br />   q也是同步ҎQ那q时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也是_当一个对象P1在不同的U程中执行这个同步方法时Q它们之间会形成互斥Q达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以Q意调用这个被加了synchronized关键字的Ҏ?br />   上边的示例代码等同于如下代码Q?br />   public void methodAAA()<br />   {<br />   synchronized (this) // (1)<br />   {<br />   //…..<br />   }<br />   }<br />   (1)处的this指的是什么呢Q它指的是调用q个Ҏ的对象,如P1。可见同步方法实质是synchronized作用于object reference。――那个拿CP1对象锁的U程Q才可以调用P1的同步方法,而对P2而言QP1q个锁与它毫不相qԌE序也可能在q种情Ş下摆脱同步机制的控制Q造成数据混ؕQ?br /> <br /> <strong>       2Q同步块Q示例代码如下:<br /> </strong>  public void method3(SomeObject so)<br />   {<br />   synchronized(so)<br />   {<br />   //…..<br />   }<br />   }<br />   q时Q锁是soq个对象Q谁拿到q个锁谁可以运行它所控制的那D代码。当有一个明的对象作ؓ锁时Q就可以q样写程序,但当没有明确的对象作为锁Q只是想让一D代码同步时Q可以创Z个特D的instance变量Q它得是一个对象)来充当锁Q?br />   class Foo implements Runnable<br />   {<br />   private byte[] lock = new byte[0]; // Ҏ的instance变量<br />   Public void methodA()<br />   {<br />   synchronized(lock) { //… }<br />   }<br />   //…..<br />   }<br />   注:雉度的byte数组对象创徏h比M对象都经――查看编译后的字节码Q生成零长度的byte[]对象只需3条操作码Q而Object lock = new Object()则需?行操作码?br />   <strong>3Q将synchronized作用于static 函数Q示例代码如下:<br /> </strong>  Class Foo<br />   {<br />   public synchronized static void methodAAA() // 同步的static 函数<br />   {<br />   //….<br />   }<br />   public void methodBBB()<br />   {<br />   synchronized(Foo.class) // class literal(cdU字面常?<br />   }<br />   }<br />   代码中的methodBBB()Ҏ是把class literal作ؓ锁的情况Q它和同步的static函数产生的效果是一LQ取得的锁很特别Q是当前调用q个Ҏ的对象所属的c(ClassQ而不再是p个Class产生的某个具体对象了Q?br />   记得在《Effective Java》一书中看到q将 Foo.class?P1.getClass()用于作同步锁q不一P不能用P1.getClass()来达到锁q个Class的目的。P1指的是由FoocM生的对象?br />   可以推断Q如果一个类中定义了一个synchronized的static函数AQ也定义了一个synchronized 的instance函数BQ那么这个类的同一对象Obj在多U程中分别访问A和B两个ҎӞ不会构成同步Q因为它们的锁都不一栗AҎ的锁是Objq个对象Q而B的锁是Obj所属的那个Class?br />   <strong>结如下Q?br /> </strong>  搞清楚synchronized锁定的是哪个对象Q就能帮助我们设计更安全的多U程E序?br />   <strong>q有一些技巧可以让我们对共享资源的同步讉K更加安全Q?br /> </strong>  1Q?定义private 的instance变量+它的 getҎQ而不要定义public/protected的instance变量。如果将变量定义为publicQ对象在外界可以l过同步Ҏ的控制而直接取得它Qƈ改动它。这也是JavaBean的标准实现方式之一?br />   2Q?如果instance变量是一个对象,如数l或ArrayList什么的Q那上述Ҏ仍然不安全,因ؓ当外界对象通过getҎ拿到q个instance对象的引用后Q又其指向另一个对象,那么q个private变量也就变了Q岂不是很危险。这个时候就需要将getҎ也加上synchronized同步Qƈ且,只返回这个private对象的clone()――这P调用端得到的是对象副本的引用了? <img src ="http://www.aygfsteel.com/baiyucheng/aggbug/243592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/baiyucheng/" target="_blank">白玉?/a> 2008-12-01 00:06 <a href="http://www.aygfsteel.com/baiyucheng/archive/2008/12/01/243592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MQ Java API ~程http://www.aygfsteel.com/baiyucheng/archive/2008/11/27/243117.html白玉?/dc:creator>白玉?/author>Thu, 27 Nov 2008 15:33:00 GMThttp://www.aygfsteel.com/baiyucheng/archive/2008/11/27/243117.htmlhttp://www.aygfsteel.com/baiyucheng/comments/243117.htmlhttp://www.aygfsteel.com/baiyucheng/archive/2008/11/27/243117.html#Feedback0http://www.aygfsteel.com/baiyucheng/comments/commentRss/243117.htmlhttp://www.aygfsteel.com/baiyucheng/services/trackbacks/243117.html阅读全文

]]>
Eclipse q_体系l构http://www.aygfsteel.com/baiyucheng/archive/2008/11/26/242734.html白玉?/dc:creator>白玉?/author>Wed, 26 Nov 2008 02:18:00 GMThttp://www.aygfsteel.com/baiyucheng/archive/2008/11/26/242734.htmlhttp://www.aygfsteel.com/baiyucheng/comments/242734.htmlhttp://www.aygfsteel.com/baiyucheng/archive/2008/11/26/242734.html#Feedback0http://www.aygfsteel.com/baiyucheng/comments/commentRss/242734.htmlhttp://www.aygfsteel.com/baiyucheng/services/trackbacks/242734.htmlhttp://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecov/index.html#N10057
author:David Gallardo


Eclipse q_是一个具有一l强大服务的框架Q这些服务支持插Ӟ比如 JDT 和插件开发环境(PDEQ。它由几个主要的部分构成Q^台运行库、工作区、工作台、团队支持和帮助?br />

?10. Eclipse q_体系l构





q_

q_q行库是内核Q它在启动时查已安装了哪些插Ӟq创建关于它们的注册表信息。ؓ降低启动旉和资源用,它在实际需要Q何插件时才加载该插g。除了内核外Q其他每样东襉K是作为插件来实现的?


工作?

工作区是负责理用户资源的插件。这包括用户创徏的项目、那些项目中的文Ӟ以及文g变更和其他资源。工作区q负责通知其他插g关于资源变更的信息,比如文g创徏、删除或更改?


工作?

工作Cؓ Eclipse 提供用户界面。它是用标准窗口工具包QSWTQ和一个更高?APIQJFaceQ来构徏的;SWT ?Java ?Swing/AWT GUI API 的非标准替代者,JFace 则徏立在 SWT 基础上,提供用户界面lg?


SWT 已被证明?Eclipse 最具争议的部分。SWT ?Swing ?SWT 更紧密地映射到底层操作系l的本机囑Ş功能Q这不仅使得 SWT 更快速,而且使得 Java E序h更像本机应用E序的外观和感觉。用这个新?GUI API可能会限?Eclipse 工作台的可移植性,不过针对大多数流行操作系l的 SWT UL版本已经可用?br />

Eclipse ?SWT 的用只会媄?Eclipse 自n的可UL性——?Eclipse 构徏的Q?Java 应用E序都不会受到媄响,除非它们使用 SWT 而不是?Swing/AWT?br />

团队支持

团队支持lg负责提供版本控制和配|管理支持。它Ҏ需要添加视图,以允许用户与所使用的Q何版本控制系l(如果有的话)交互。大多数插g都不需要与团队支持lg交互Q除非它们提供版本控制服务?


帮助

帮助lgh?Eclipse q_本n相当的可扩展能力。与插g?Eclipse d功能相同Q帮助提供一个附加的Dl构Q允许工具以 HTML 文g的Ş式添加文档?br />

]]>
Netbeans版本语言讄http://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242665.html白玉?/dc:creator>白玉?/author>Tue, 25 Nov 2008 15:14:00 GMThttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242665.htmlhttp://www.aygfsteel.com/baiyucheng/comments/242665.htmlhttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242665.html#Feedback0http://www.aygfsteel.com/baiyucheng/comments/commentRss/242665.htmlhttp://www.aygfsteel.com/baiyucheng/services/trackbacks/242665.html        最q项目要用到NetbeansQ于是在|上down了Netbeans6.1Q装上之后是中文版的。猜想一定是在下载的时候没有选择语言选项Q所以又重新选择了English版本下蝲了一ơ。可安装的时候还是中文版。于是上|搜索了一下资料才知道可以通过配置Netbeans启动参数来改变版本语a。要惛_中文版{换成英文版只需在在 IDE-HOME/etc/netbeans.conf 文g中设|?netbeans_default_options d启动参数Q?-locale en_US 卛_Q如下:
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 --locale en_US "



]]>
l工E添加Naturehttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242662.html白玉?/dc:creator>白玉?/author>Tue, 25 Nov 2008 14:57:00 GMThttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242662.htmlhttp://www.aygfsteel.com/baiyucheng/comments/242662.htmlhttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242662.html#Feedback0http://www.aygfsteel.com/baiyucheng/comments/commentRss/242662.htmlhttp://www.aygfsteel.com/baiyucheng/services/trackbacks/242662.htmlpackage com.byc.natures;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.runtime.CoreException;


/**
 * 
 * 
@author Bai Yucheng 2008-4-28
 * 
 
*/

public class MyProjectNature implements IProjectNature {
 
private IProject project;

 
public void configure() throws CoreException {
  
//do nothing
 }


 
public void deconfigure() throws CoreException {
  
//do nothing
 }


 
public IProject getProject() {
  
return project;
 }


 
public void setProject(IProject iproject) {
  project 
= iproject;
 }


}



2. d扩展点:org.eclipse.core.resources.naturesQ设|class属性ؓ我们的nature

<extension
      
id="com.byc.MyProjectNature"
      name
="Project Nature"
      point
="org.eclipse.core.resources.natures">
   
<runtime>
      
<run
            
class="com.byc.natures.MyProjectNature">
      
</run>
   
</runtime>
</extension>


3. 在新建工E的向导中添加我们的natureQ添加方法ؓQ?/p>

private void addProjectNature(IProject project) throws CoreException {
   
if (!project.hasNature(PROJECT_NATURE)) {
   
try {
    IProjectDescription description 
= project.getDescription();
    String[] natures 
= description.getNatureIds();
    String[] newNatures 
= new String[natures.length + 1];
    System.arraycopy(natures, 
0, newNatures, 0, natures.length);
    newNatures[natures.length] 
= PROJECT_NATURE;
    description.setNatureIds(newNatures);
    project.setDescription(description, 
null);
   }
 catch (CoreException e) {
    e.printStackTrace();
   }

  }

 }


]]>
EMF基础知识U篏http://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242657.html白玉?/dc:creator>白玉?/author>Tue, 25 Nov 2008 14:26:00 GMThttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242657.htmlhttp://www.aygfsteel.com/baiyucheng/comments/242657.htmlhttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242657.html#Feedback0http://www.aygfsteel.com/baiyucheng/comments/commentRss/242657.htmlhttp://www.aygfsteel.com/baiyucheng/services/trackbacks/242657.html
  1. EMF core 除了生成model?/span>model implementation外,臛_q生成两个接口:*Factory?/span>*Package。其?/span>, FactoryQ生成实例的工厂Q?/span>PackageQ提供一些静态的constantsQ例如:被用来生成方法的feature constants     Q和一些访问模型元数据的公用方法?/span>

 

2. EMF生成的方法都带有“@generated”标签?/span>EMF重新生成代码时不会覆盖用h加的ҎQ不带有@generatedQ?/span>

 

3. 关于URIQ?/span>Uniform Resource IdentifierQ?/span>

?/span>EMF 中是通过URI来标?/span>package的,q且通过URI来唯一的确?/span>resources?/span>URI包括三个部分Q?/span>a scheme, a scheme-specific part?/span>an optional fragment?/span>scheme主要军_了访?/span>

资源的协议;比如Q?/span>Platform:/resource/……中的platform?/span>scheme-specific part包含一?/span>authority, device和一?/span>segmentsQ如file:/c:/dir1/dir2/myfile.xmlQ?/span>file是协议,没有authorityQ?/span>c:?/span>device,剩下?/span>3个是segments?/span>URI fragment 标识?/span>resource内部的某个具体的内容。如Q?/span>file:/c:/dir1/dir2/myfile.xml#loc中的#loc?/span> EMF通过带有fragment?/span>URI来访问资源中?/span>EObjects?/span>

 

4. 关于URIConverter

URIConverter的作用是normalize一个输?/span>URIQ之成Z个实际的针对某个resource?/span>URI。它可以?/span>namespace URIsQ比如:http:///com/example/epo2.ecoreQ映到物理文g?/span>URIs, 或者重定向旧的Q或别名Q的URI参考到一个具体的实际?/span>location。一?/span>URIConverterl护一?/span>URI?/span>URI的映集合。比如,把一个命名空?/span>URI映射到物理文Ӟ

URIConverter converter = new URIConverterImpl();

URI uri1 = URI.createURI("http:///somemodel.ecore");

URI uri2 =URI.createURI("platform:/resource/project/somemodel.ecore");

converter.getURIMap().put(uri1, uri2);

在如下面代码Q?/span>

URI normalized = converter.normalize(uri1);

System.out.println(normalized);

打印的结果是Q?/span>platform:/resource/project/somemodel.ecore

URIConverter.normalize()Ҏ只是单的通过映射?/span>map?/span>key替换成了相应?/span>value?/span>

URIConverter的最原始是应用在resource setsQ用来定?/span>resources.

 

5. 关于Resource?/span>ResourceSet

Resource 表示一个持久化?/span>EOjbects的容器;ResourceSet表示一l?/span>Resource的集合,集合中的Resource同时创徏或加载?/span>Resource中比较重要的是save?/span>loadҎQ还有通过URI fragments讉K资源中的Object的机Ӟ如:

Resource resource =…

Item item = (Item)resource.getEObject("http://@orders.0/@items.2");

Item item =…

String fragment = resource.getURIFragment(item);

上面代码中的两个ҎQ?/span>getEObject通过带有fregment?/span>URI获得一?/span>EObjectQ与之相反的ҎgetURIFragment()通过EObject获得相应?/span>fragment path?/span>

ResourceSet中有些重要的ҎQ?/span>

createResource()创徏一个空?/span>ResourceQ?/span>

getResource()通过resource?/span>URI来创?/span>ResourceQ?/span>

getEObject()Q通过URI中的fregment来获得具体的EObject对象?/span>

 

6. 关于Resource.Factory

用来创徏ResourceQ?/span>resource factory 要注册到Registry实例中。一?/span>factory 可以通过多种方式?/span>URIs来注册,包括URI scheme或?/span>URI?/span>extension。在插g方式的应用中Q通过扩展点的方式在插件加载的时候注?/span>descriptor。下面是Resource的源代码

public interface Resource extends Notifier

{

interface Factory

{

Resource createResource(URI uri);

interface Descriptor

{

Factory createFactory();

}

interface Registry

{

Factory getFactory(URI uri);

Map getProtocolToFactoryMap();

String DEFAULT_EXTENSION = "*";

Map getExtensionToFactoryMap();

Registry INSTANCE = new ResourceFactoryRegistryImpl

();

}

}

}

下面?/span>Registry中的getFactory()Ҏ的算法(引用原文Q:

1. Check for a factory in the protocolToFactoryMap, using

the scheme of the URI.

2. If nothing was found, check the extensionToFactoryMap

using the file extension of the URI.

3. If still nothing was found, check the

extensionToFactoryMap using the DEFAULT_EXTENSION

(that is, the wildcard character "*").

4. If no extension match was found, call the

delegatedGetFactory() method. This allows you to supply

your own factory registry, with its own lookup

criteria.

5. If a descriptor was found, instead of an actual

factory, call the createFactory() method on the

descriptor to create the factory.

6. Finally, return the factory if one was found, or null.

tipQ?/span>emf~省的序列化方式?/span>XMI。因此,如果没有扑ֈ相应注册?/span>factory~省的就会返回以*注册的缺省的factoryQ这?/span>factory是针?/span>XMI?/span>factoryQ即XMIResourceFactoryImpl。如Q对?/span>XMIResourceFactoryImpl的扩展点声明:

<extension point = "org.eclipse.emf.ecore.extension_parser">

<parser type="*" class="org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl"/>

</extension>

当非插g应用的时候,可以通过手工的方式来注册factoryQ如Q?/span>

Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put

("*", new XMIResourceFactoryImpl());

 

7. Resource通过两种方式实现XML?/span>XMI?/span>

1) XML

实现Resource存储的重要方法是save, 只有在方?/span>eIsSet()q回trueӞ相关的属性和引用才会被序列化?/span>xml中。对于存储的xml文g的格式可以通过讄OPTION_XML_MAP属性来完成Q如下面原文Q?/span>

There are several reasons why you might want to use OPTION_XML_MAP when saving a resource:

1. You want to save your data so that it conforms to a particular XML Schema.

2. You have changed your model, and you want the resource to produce XML documents that will work with the old version of the model.

3. You want to design your own XML format without changing your model.

2) XMI

XMI?/span>XML基本相同Q?/span>XMIResourceImpl

XMLResourceImpl的简单承,只是在引?/span>objects时?/span>XMI IDs



]]>
删除默认的工h选项http://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242655.html白玉?/dc:creator>白玉?/author>Tue, 25 Nov 2008 14:13:00 GMThttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242655.htmlhttp://www.aygfsteel.com/baiyucheng/comments/242655.htmlhttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242655.html#Feedback0http://www.aygfsteel.com/baiyucheng/comments/commentRss/242655.htmlhttp://www.aygfsteel.com/baiyucheng/services/trackbacks/242655.html 

<extension point="org.eclipse.gmf.runtime.diagram.ui.paletteProviders"> 
   
<paletteProvider class="org.eclipse.gmf.runtime.diagram.ui.providers.DefaultPaletteProvider">
     
<Priority name="High"/>
       
<contribution>
       
<predefinedEntry id="standardGroup/zoomInTool" remove="true"/>
       
<predefinedEntry
             
id="standardGroup/zoomOutTool"
             remove
="true">
       
</predefinedEntry>
       
<predefinedEntry id="standardGroup/noteStack/noteTool" remove="true"/> 
   
<predefinedEntry id="standardGroup/noteStack/textTool" remove="true"/> 
   
<predefinedEntry id="standardGroup/noteStack/noteattachmentTool" remove="true"/>
       
</contribution>
       
<editor
             
id="dbdesigner.diagram.part.DbdesignerDiagramEditorID">
       
</editor>
   
</paletteProvider>
</extension> 


]]>
为图形增加Decorationhttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242651.html白玉?/dc:creator>白玉?/author>Tue, 25 Nov 2008 14:11:00 GMThttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242651.htmlhttp://www.aygfsteel.com/baiyucheng/comments/242651.htmlhttp://www.aygfsteel.com/baiyucheng/archive/2008/11/25/242651.html#Feedback0http://www.aygfsteel.com/baiyucheng/comments/commentRss/242651.htmlhttp://www.aygfsteel.com/baiyucheng/services/trackbacks/242651.htmlDecoration Service?/span>GMF Runtime提供的一?/span>Service。它的目的是为已有图形添加修饎ͼ它ƈ不需要已有图形的M信息Q?/span>icon?/span>figure都可以作?/span>decoration加到囑Ş上。要为图形添?/span>DecorationQ首先要~写一?/span>DecoratorcR它可以l承AbstractDecoratorQؓ了满求我们要重写其中两个ҎQ?/span>activate()?/span>refresh ()?/span>activateҎ主要功能是激z?/span>DecoratorQ一般只需调用refreshҎ卛_?/span>Refresh负责?/span>decorator target变化时刷?/span>DecoratorQ即保持二者之间的同步。在q里我们可以设|自qDecorationQ如自定义的icon?/span>figureQ。如果想实现Decoration动态响应模型的改变Q我们可以让Decorator实现NotificationListener接口Q这h们就可以监听模型的改变了。实?/span>notifyChangedҎQ在此方法中Ҏ需求ؓ模型d监听器。做?/span>Decorator之后Q我们就要ؓq个Decorator~写一?/span>Provider,它需l承AbstractProviderq实?/span>IDecoratorProvider接口。然后实?/span>createDecorators?/span>provides两个Ҏ。在createDecoratorsҎ中安装我们的Decorator?/span>

Provides中判断添?/span>Decorator的条件。最后就要注册我们的Provider了。添加扩展点Q?/span>

org.eclipse.gmf.runtime.diagram.ui.decorator.providersQ将decoration provider设成我们?/span>ProviderQ至此大功造成Q?/span>

]]>
正则表达式基知识http://www.aygfsteel.com/baiyucheng/archive/2008/11/24/242360.html白玉?/dc:creator>白玉?/author>Mon, 24 Nov 2008 12:47:00 GMThttp://www.aygfsteel.com/baiyucheng/archive/2008/11/24/242360.htmlhttp://www.aygfsteel.com/baiyucheng/comments/242360.htmlhttp://www.aygfsteel.com/baiyucheng/archive/2008/11/24/242360.html#Feedback0http://www.aygfsteel.com/baiyucheng/comments/commentRss/242360.htmlhttp://www.aygfsteel.com/baiyucheng/services/trackbacks/242360.html
JScript VBScript 匚w
/^\[ \t]*$/ "^\[ \t]*$" 匚w一个空白行?/td>
/\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID L是否׃?位数字,一个连字符以及一?位数字组成?/td>
/<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匚w一?HTML 标记?/td>

下表是元字符及其在正则表辑ּ上下文中的行为的一个完整列表:
字符 描述
\ 下一个字W标Cؓ一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/td>
^ 匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?/td>
$ 匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?/td>
* 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/td>
+ 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/td>
? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/td>
{n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td>
{n,} n 是一个非负整数。至匹?em>n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/td>
{n,m} m ?n 均ؓ非负整数Q其?em>n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/td>
? 当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/td>
. 匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/td>
(pattern) 匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0$9 属性。要匚w圆括号字W,请?'\(' ?'\)'?/td>
(?:pattern) 匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/td>
(?=pattern) 正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?/td>
(?!pattern) 负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开?
x|y 匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?/td>
[xyz] 字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?/td>
[^xyz] 负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?/td>
[a-z] 字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?/td>
[^a-z] 负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?/td>
\b 匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?/td>
\B 匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/td>
\cx 匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符?em>x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/td>
\d 匚w一个数字字W。等价于 [0-9]?/td>
\D 匚w一个非数字字符。等价于 [^0-9]?/td>
\f 匚w一个换늬。等价于 \x0c ?\cL?/td>
\n 匚w一个换行符。等价于 \x0a ?\cJ?/td>
\r 匚w一个回车符。等价于 \x0d ?\cM?/td>
\s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td>
\S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td>
\t 匚w一个制表符。等价于 \x09 ?\cI?/td>
\v 匚w一个垂直制表符。等价于 \x0b ?\cK?/td>
\w 匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?/td>
\W 匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?/td>
\xn 匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?
\num 匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?/td>
\n 标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?/td>
\nm 标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?/td>
\nml 如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ八进制数?(0-7)Q则匚w八进制{义?nml?/em>
\un 匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (©)?/td>


下面看几个例子:
"^The"Q表C所有以"The"开始的字符Ԍ"There"Q?The cat"{)Q?
"of despair$"Q表C所以以"of despair"l尾的字W串Q?
"^abc$"Q表C开始和l尾都是"abc"的字W串——呵呵,只有"abc"自己了;
"notice"Q表CZQ何包?notice"的字W串?

'*'Q?+'??'q三个符P表示一个或一序列字符重复出现的次数。它们分别表C?#8220;没有?
更多”Q?#8220;一ơ或更多”q有“没有或一?#8221;。下面是几个例子Q?

"ab*"Q表CZ个字W串有一个a后面跟着零个或若q个b。("a", "ab", "abbb",……Q;
"ab+"Q表CZ个字W串有一个a后面跟着臛_一个b或者更多;
"ab?"Q表CZ个字W串有一个a后面跟着零个或者一个bQ?
"a?b+$"Q表C在字符串的末尾有零个或一个a跟着一个或几个b?

也可以用范_用大括号括vQ用以表C重复次数的范围?

"ab{2}"Q表CZ个字W串有一个a跟着2个bQ?abb"Q;
"ab{2,}"Q表CZ个字W串有一个a跟着臛_2个bQ?
"ab{3,5}"Q表CZ个字W串有一个a跟着3?个b?

h意,你必L定范围的下限Q如Q?{0,2}"而不?{,2}"Q。还有,你可能注意到了,'*'Q?+'?
'?'相当?{0,}"Q?{1,}"?{0,1}"?
q有一?¦'Q表C?#8220;?#8221;操作Q?

"hi¦hello"Q表CZ个字W串里有"hi"或?hello"Q?
"(b¦cd)ef"Q表C?bef"?cdef"Q?
"(a¦b)*c"Q表CZ?a""b"混合的字W串后面跟一?c"Q?

'.'可以替代M字符Q?

"a.[0-9]"Q表CZ个字W串有一?a"后面跟着一个Q意字W和一个数字;
"^.{3}$"Q表C有L三个字符的字W串Q长度ؓ3个字W)Q?

Ҏ可C某些字W允许在一个字W串中的某一特定位置出现Q?

"[ab]"Q表CZ个字W串有一?a"?b"Q相当于"a¦b"Q;
"[a-d]"Q表CZ个字W串包含写?a'?d'中的一个(相当?a¦b¦c¦d"或?[abcd]"Q;
"^[a-zA-Z]"Q表CZ个以字母开头的字符Ԍ
"[0-9]%"Q表CZ个百分号前有一位的数字Q?
",[a-zA-Z0-9]$"Q表CZ个字W串以一个逗号后面跟着一个字母或数字l束?

你也可以在方括号里用'^'表示不希望出现的字符Q?^'应在Ҏ号里的第一位。(如:"%[^a-zA-Z]%"?
CZ个百分号中不应该出现字母Q?

Z逐字表达Q必d"^.$()¦*+?{\"q些字符前加上{UdW?\'?

h意在Ҏ号中Q不需要{义字W?/p>

]]>
վ֩ģ壺 | | ˮ| | | | ԭ| غ| ګ| Ϋ| ͨ| | ͨ| ֲ| | | | ƽ| Ϫ| ˮ| | | ǿ| | лͨ| | Ӧ| ƽ| ˳| | | ɽ| ij| | ̺| | ¡Ң| | ƽ| | |