﻿<?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-iNeo-随笔分类-Eclipse</title><link>http://www.blogjava.net/iNeo/category/5353.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:20:27 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:20:27 GMT</pubDate><ttl>60</ttl><item><title>Eclipse的数据库插件</title><link>http://www.blogjava.net/iNeo/archive/2006/03/30/38228.html</link><dc:creator>只牵这只狗</dc:creator><author>只牵这只狗</author><pubDate>Thu, 30 Mar 2006 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/iNeo/archive/2006/03/30/38228.html</guid><wfw:comment>http://www.blogjava.net/iNeo/comments/38228.html</wfw:comment><comments>http://www.blogjava.net/iNeo/archive/2006/03/30/38228.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iNeo/comments/commentRss/38228.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iNeo/services/trackbacks/38228.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">今天上午升级</span>
				<span lang="EN-US">Eclipse</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到</span>
				<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?>
				<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">
						<span lang="EN-US">3.1.2</span>
				</st1:chsdate>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本，完了之后就想找个数据库的插件，但花了近</span>
				<span lang="EN-US">2</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.1.x</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本的数据库插件，郁闷的不行。看看</span>
				<span lang="EN-US">eclipse3.1.12</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的发行日期——</span>
				<span lang="EN-US">2005.12.26</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，咳，去年</span>
				<span lang="EN-US">12</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.1.x</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: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虽然没找到正主，但还是找到了一些</span>
				<span lang="EN-US">Eclipse3.0.x</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: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-outline-level: 2" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 11pt; COLOR: #006699; FONT-FAMILY: Arial; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt">SQLExplorer</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: Arial; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt">
						<br />
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">SQLExplorer</span>
				<span style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">可以通过<span lang="EN-US">JDBC</span>访问几乎任何一种数据库。同时也支持像<span lang="EN-US">Hibernate</span>这样的工具访问数据库。现在的版本是<span lang="EN-US">SQLExporer <st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">2.2.4</st1:chsdate> released</span>。<span lang="EN-US"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-outline-level: 2" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">下栽地址：<span lang="EN-US">http://sourceforge.net/projects/eclipsesql<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-outline-level: 2" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 11pt; COLOR: #006699; FONT-FAMILY: Arial; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt">
								<a href="http://www.open-open.com/open44504.htm">
										<span style="COLOR: #006699; TEXT-DECORATION: none; mso-bidi-font-size: 12.0pt; text-underline: none">JFaceDBC</span>
								</a>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-outline-level: 2" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: Arial">是一个很好的</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: ˎ̥; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">SQL </span>
				<span style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: Arial">控制台</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: ˎ̥; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">,</span>
				<span style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: Arial">支持各类主流数据库。现在的版本是</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: ˎ̥; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">JFaceDbc 3.0<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-outline-level: 2" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">下栽地址：<span lang="EN-US">http://sourceforge.net/projects/jfacedbc<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-outline-level: 2" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 11pt; COLOR: #006699; FONT-FAMILY: Arial; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt">Quantum</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: Arial; LETTER-SPACING: 0.75pt; mso-font-kerning: 0pt">
						<br />
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">Quantum</span>
				<span style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">是一个数据库访问插件<span lang="EN-US">.</span>它当前支持的数据库有<span lang="EN-US">:Postgres,MySQL,Adabas,DB2,Oracle</span>与有<span lang="EN-US">JDBC</span>驱动的数据库<span lang="EN-US">.</span>它可以显示表格<span lang="EN-US">,</span>视图并提供一个语法可高亮显示的<span lang="EN-US">SQL</span>编辑器</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">com.quantum.feature_<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">3.0.1</st1:chsdate>.bin.dist</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-outline-level: 2" align="left">
				<span style="FONT-SIZE: 10pt; COLOR: #333333; FONT-FAMILY: 宋体; LETTER-SPACING: 0.75pt; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">下栽地址：<span lang="EN-US">http://sourceforge.net/project/showfiles.php?group_id=7746&amp;package_id=57047<o:p></o:p></span></span>
		</p>
<img src ="http://www.blogjava.net/iNeo/aggbug/38228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iNeo/" target="_blank">只牵这只狗</a> 2006-03-30 12:42 <a href="http://www.blogjava.net/iNeo/archive/2006/03/30/38228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>任何人都可以重构[来自IBM]</title><link>http://www.blogjava.net/iNeo/archive/2006/01/17/28305.html</link><dc:creator>只牵这只狗</dc:creator><author>只牵这只狗</author><pubDate>Tue, 17 Jan 2006 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/iNeo/archive/2006/01/17/28305.html</guid><wfw:comment>http://www.blogjava.net/iNeo/comments/28305.html</wfw:comment><comments>http://www.blogjava.net/iNeo/archive/2006/01/17/28305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iNeo/comments/commentRss/28305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iNeo/services/trackbacks/28305.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD width="100%">
<H1>任何人都可以重构</H1>
<P id=subtitle>使用 Eclipse 自动重构特性的方法与原因</P><IMG class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1></TD>
<TD class=no-print width=192></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD width=10><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></TD>
<TD width="100%">
<TABLE class=no-print cellSpacing=0 cellPadding=0 width=160 align=right border=0>
<TBODY>
<TR>
<TD width=10><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></TD>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
<TBODY>
<TR>
<TD class=v14-header-1-small></TD></TR></TBODY></TABLE>
<TABLE class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=no-padding width=150>
<TABLE cellSpacing=0 cellPadding=0 width=143 border=0><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8> 
<FORM name=email action=https://www-130.ibm.com/developerworks/secure/email-it.jsp>
<SCRIPT language=JavaScript type=text/javascript>
<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');
//-->
</SCRIPT>
&nbsp;
<TBODY>
<TR vAlign=top>
<TD width=8><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></TD>
<TD width=16></TD>
<TD width=122>
<P><A class=smallplainlink href="javascript:document.email.submit();"><B><FONT color=#5c81a7 size=2></FONT></B></A>&nbsp;</P></TD></TR><NOSCRIPT><tr valign="top"><td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"/></td><td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"/></td><td class="small" width="122"><p><span class="ast">未显示需要 JavaScript 的文档选项</span></p></td></tr></NOSCRIPT></FORM></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
<TBODY>
<TR>
<TD class=v14-header-1-small>对此页的评价</TD></TR></TBODY></TABLE>
<TABLE class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=no-padding width=150>
<TABLE cellSpacing=0 cellPadding=0 width=143 border=0>
<TBODY>
<TR vAlign=top>
<TD width=8><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></TD>
<TD></TD>
<TD width=125>
<P><B><FONT color=#996699 size=2></FONT></B>&nbsp;</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE>
<P>级别: 初级</P>
<P><A href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/#author"><FONT color=#996699>David Gallardo</FONT></A>, 独立软件顾问和作家<BR></P>
<P>2003 年 11 月 10 日</P>
<BLOCKQUOTE>Eclipse 提供了一组强大的自动重构（refactoring）功能，这些功能穿插在其他功能当中，使您能够重命名 Java元素，移动类和包，从具体的类中创建接口，将嵌套的类变成顶级类，以及从旧方法的代码片断中析取出新的方法。您熟悉了 Eclipse 的重构工具之后，就掌握了一种提高生产率的好方法。本文综览Eclipse 的重构特性，并通过例子阐明了使用这些特性的方法与原因。</BLOCKQUOTE>
<P><A name=N1004A><SPAN class=atitle><FONT face=Arial size=4>为什么重构?</FONT></SPAN></A></P>
<P><I>重构</I>是指在不改变程序功能的前提下改变其结构。重构是一项功能强大的技术，但是执行起来需要倍加小心才行。主要的危险在于可能在不经意中引入一些错误，尤其是在进行手工重构的时候更是如此。这种危险引发了对重构技术的普遍批评：当代码不会崩溃的时候为什么要修改它呢？ </P>
<P>您需要进行代码重构的原因可能有以下几个：传说中的第一个原因是：需要继承为某个古老产品而开发的年代久远的代码，或者突然碰到这些代码。最初的开发团队已经不在了。我们必须创建增加了新特性的新版本软件，但是这些代码已经无法理解了。新的开发队伍夜以继日地工作，破译代码然后映射代码，经过大量的规划与设计之后，人们将这些代码分割成碎片。历经重重磨难之后，所有这些东西都按照新版本的要求归位了。这是英雄般的重构故事，几乎没有人能在经历了这些之后活着讲述这样的故事。</P>
<P>还有一种现实一些的情况是项目中加入了新的需求，需要对设计进行修改。至于是因为在最初的规划过程中失察，还是由于采用了迭代式的开发过程（比如敏捷开发，或者是测试驱动的开发）而在开发过程中有意引入需求，这两者并没有实质性的区别。这样的重构的规模要小得多，其内容一般涉及通过引入接口或者抽象类来更改类的继承关系，以及对类进行分割和重新组织，等等。</P>
<P>重构的最后一个原因是，当存在可用的自动重构工具时，可以有一个用来预先生成代码的快捷方式——就好比在您无法确定如何拼写某个单词的时候，可以用某种拼写检查工具输入这个单词。比如说，您可以用这种平淡无奇的重构方法生成 getter 和 setter 方法，一旦熟悉了这样的工具，它就可以为您节省很多的时间。</P>
<P>Eclipse 的重构工具无意进行英雄级的重构——适合这种规模的工具几乎没有——但是不论是否用到敏捷开发技术，Eclipse 的工具对于一般程序员修改代码的工作都具有无法衡量的价值。毕竟任何复杂的操作只要能够自动进行，就可以不那么烦闷了。只要您知道 Eclipse 实现了什么样的重构工具，并理解了它们的适用情况，您的生产力就会得到极大的提高。</P>
<P>要降低对代码造成破坏的风险，有两种重要的方法。第一种方法是对代码进行一套完全彻底的单元测试：在重构之前和之后都必须通过这样的测试。第二种方法是使用自动化的工具来进行重构，比如说 Eclipse 的重构特性。</P>
<P>将彻底的测试与自动化重构结合起来就会更加有效了，这样重构也就从一种神秘的艺术变成了有用的日常工具。为了增加新的功能或者改进代码的可维护性，我们可以在不影响原有代码功能的基础上迅速且安全地改变其结构。这种能力会对您设计和开发代码的方式产生极大的影响，即便是您没有将其结合到正式的敏捷方法中也没有关系。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/#main"><B><FONT color=#996699>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=N10068><SPAN class=atitle><FONT face=Arial size=4>Eclipse 中重构的类型</FONT></SPAN></A></P>
<P>Eclipse 的重构工具可以分为三大类（下面的顺序也就是这些工具在 Refactoring 菜单中出现的顺序）：</P>
<OL>
<LI>对代码进行重命名以及改变代码的物理结构，包括对属性、变量、类以及接口重新命名，还有移动包和类等。 
<LI>改变类一级的代码逻辑结构，包括将匿名类转变为嵌套类，将嵌套类转变为顶级类、根据具体的类创建接口，以及从一个类中将方法或者属性移到子类或者父类中。 
<LI>改变一个类内部的代码，包括将局部变量变成类的属性、将某个方法中选中部分的代码变成一个独立的方法、以及为属性生成 getter 和 setter 方法。 </LI></OL>
<P>还有几个重构工具并不能完全归入这三个种类，特别是 Change Method Signature，不过在本文中还是将这个工具归入第三类。除了这种例外情况以外，本文下面几节都是按照上面的顺序来讨论 Eclipse 重构工具的。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/#main"><B><FONT color=#996699>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=N10080><SPAN class=atitle><FONT face=Arial size=4>物理重组与重命名</FONT></SPAN></A></P>
<P>显然，您即便没有特别的工具，也可以在文件系统中重命名文件或者是移动文件，但是如果操作对象是 Java 源代码文件，您就需要编辑很多文件，更新其中的 <CODE>import </CODE>或 <CODE>package </CODE>语句。与此类似，用某种文本编辑器的搜索与替换功能也可以很容易地给类、方法和变量重新命名，但是这样做的时候必须十分小心，因为不同的类可能具有名称相似的方法或者变量；要是从头到尾检查项目中所有的文件，来保证每个东西的标识和修改的正确性，那可真够乏味的。 </P>
<P>Eclipse 的 Rename 和 Move 工具能够十分聪明地在整个项目中完成这样的修改，而不需要用户的干涉。这是因为 Eclipse 可以理解代码的语义，从而能够识别出对某个特定方法、变量或者类名称的引用。简化这一任务有助于确保方法、变量和类的名称能够清晰地指示其用途。</P>
<P>我们经常可以发现代码的名字不恰当或者令人容易误解，这是因为代码与最初设计的功能有所不同。比方说，某个用来在文件中查找特定单词的程序也许会扩展为在 Web 页面中通过 URL 获取 <CODE>InputStream </CODE>的操作。如果这一输入流最初叫做 <CODE>file</CODE> ，那么就应该修改它的名字，以便能反映其新增的更加一般的特性，比方说 <CODE>sourceStream</CODE> 。开发人员经常无法成功地修改这些名称，因为这个过程是十分混乱和乏味的。这当然也会把下一个不得不对这些类进行操作的开发人员弄糊涂。 </P>
<P>要对某个 Java 元素进行重命名，只需要简单地从 Package Explorer 视图中点击这个元素，或者从Java 源代码文件中选中这个元素，然后选择菜单项 <B>Refactor &gt; Rename</B>。在对话框中输入新的名称，然后选择是否需要 Eclipse 也改变对这个名称的引用。实际显示出来的确切内容与您所选元素的类型有关。比方说，如果选择的属性具有 getter 和 setter 方法，那么也就可以同时更新这些方法的名称，以反映新的属性。图1显示了一个简单的例子。 </P>
<P><A name=figure1><B>图 1. 重命名一个局部变量</B> </A><BR><IMG height=221 alt="Renaming a local variable" src="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/rename.gif" width=488> </P>
<P>就像所有的 Eclipse 重构操作一样，当您指定了全部用来执行重构的必要信息之后，您就可以点击 <B>Preview</B> 按钮，然后在一个对话框中对比 Eclipse 打算进行哪些变更，您可以分别否决或者确认每一个受到影响的文件中的每一项变更。如果您对于 Eclipse 正确执行变更的能力有信心的话，您可以只按下 <B>OK</B>按钮。显然，如果您不确定重构到底做了什么事情，您就会想先预览一下，但是对于 Rename 和 Move 这样简单的重构而言，通常没有必要预览。 </P>
<P>Move 操作与 Rename 十分相似：您选择某个 Java 元素（通常是一个类），为其指定一个新位置，并定义是否需要更新引用。然后，您可以选择 <B>Preview</B>检查变更情况，或者选择 <B>OK</B> 立即执行重构，如图2所示。 </P>
<P><A name=figure2><B>图 2. 将类从一个包移到另一个包</B> </A><BR><IMG height=569 alt="Moving a class" src="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/move.gif" width=513> </P>
<P>在某些平台上（特别是 Windows），您还可以在 Package Explorer 视图中通过简单拖放的方法将类从一个包或者文件夹中移到另一个包或文件夹中。所有的引用都会自动更新。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/#main"><B><FONT color=#996699>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=N100E2><SPAN class=atitle><FONT face=Arial size=4>重新定义类的关系</FONT></SPAN></A></P>
<P>Eclipse 中有大量的重构工具，使您能够自动改变类的关系。这些重构工具并没有 Eclipse 提供的其他工具那么常用，但是很有价值，因为它们能够执行非常复杂的任务。可以说，当它们用得上的时候，就会非常有用。</P>
<P><A name=N100EB><SPAN class=smalltitle><STRONG><FONT face=Arial>提升匿名类与嵌套类</FONT></STRONG></SPAN></A></P>
<P>Convert Anonymous Class（转换匿名类）和 Convert Nested Type（转换嵌套类）这两种重构方法比较相似，它们都将某个类从其当前范围移动到包含这个类的范围上。</P>
<P>匿名类是一种语法速写标记，使您能够在需要实现某个抽象类或者接口的地方创建一个类的实例，而不需要显式提供类的名称。比如在创建用户界面中的监听器时，就经常用到匿名类。在清单1中，假设 Bag 是在其他地方定义的一个接口，其中声明了两个方法， <CODE>get() </CODE>和 <CODE>set()</CODE> 。 </P><BR><A name=N100FF><B>清单 1. Bag 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section><FONT face="Lucida Console"> 
      public class BagExample
{
   void processMessage(String msg)
   {
      Bag bag = new Bag()
      {
         Object o;
         public Object get()
         {
            return o;
         }
         public void set(Object o)
         {
            this.o = o;
         }
      };
      bag.set(msg);
      MessagePipe pipe = new MessagePipe();
      pipe.send(bag);
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>当匿名类变得很大，其中的代码难以阅读的时候，您就应该考虑将这个匿名类变成严格意义上的类；为了保持封装性（换句话说，就是将它隐藏起来，使得不必知道它的外部类不知道它），您应该将其变成嵌套类，而不是顶级类。您可以在这个匿名类的内部点击，然后选择 <B>Refactor &gt; Convert Anonymous Class to Nested </B>就可以了。当出现确认对话框的时候，为这个类输入名称，比如 <CODE>BagImpl</CODE> ，然后选择 <B>Preview</B>或者 <B>OK</B>。这样，代码就变成了如清单2所示的情形。 </P><BR><A name=N10119><B>清单 2. 经过重构的 Bag 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section><FONT face="Lucida Console"> 

public class BagExample
{
   private final class BagImpl implements Bag
   {
      Object o;
      public Object get()
      {
         return o;
      }
      public void set(Object o)
      {
         this.o = o;
      }
   }
       
   void processMessage(String msg)
   {
     Bag bag = new BagImpl();
     bag.set(msg);
     MessagePipe pipe = new MessagePipe();
     pipe.send(bag);
   }
}</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>当您想让其他的类使用某个嵌套类时，Convert Nested Type to Top Level 就很有用了。比方说，您可以在一个类中使用值对象，就像上面的 <CODE>BagImpl</CODE> 类那样。如果您后来又决定应该在多个类之间共享这个数据，那么重构操作就能从这个嵌套类中创建新的类文件。您可以在源代码文件中高亮选中类名称（或者在 Outline 视图中点击类的名称），然后选择 <B>Refactor &gt; Convert Nested Type to Top Level</B>，这样就实现了重构。 </P>
<P>这种重构要求您为装入实例提供一个名字。重构工具也会提供建议的名称，比如 <CODE>example</CODE> ，您可以接受这个名字。这个名字的意思过一会儿就清楚了。点击 <B>OK</B> 之后，外层类 <CODE>BagExample</CODE> 就会变成清单3所示的样子。 </P><BR><A name=N1013B><B>清单 3. 经过重构的 Bag 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public class BagExample
{
   void processMessage(String msg)
   {
      Bag bag = new BagImpl(this);
      bag.set(msg);
      MessagePipe pipe = new MessagePipe();
      pipe.send(bag);
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>请注意，当一个类是嵌套类的时候，它可以访问其外层类的成员。为了保留这种功能，重构过程将一个装入类 <B>BagExample</B> 的实例放在前面那个嵌套类中。这就是之前要求您输入名称的实例变量。同时也创建了用于设置这个实例变量的构造函数。重构过程创建的新类 <B>BagImpl</B> 如清单4所示。 </P><BR><A name=N1014E><B>清单 4. BagImpl 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section><FONT face="Lucida Console">  
final class BagImpl implements Bag
{
   private final BagExample example;
   /**
    * @paramBagExample
    */
  BagImpl(BagExample example)
   {
      this.example = example;
      // TODO Auto-generated constructor stub
   }
   Object o;
   public Object get()
   {
      return o;
   }
   public void set(Object o)
   {
      this.o = o;
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>如果您的情况与这个例子相同，不需要保留对 <CODE>BagExample</CODE> 的访问，您也可以很安全地删除这个实例变量与构造函数，将 <CODE>BagExample</CODE> 类中的代码改成缺省的无参数构造函数。 </P>
<P><A name=N10163><SPAN class=smalltitle><STRONG><FONT face=Arial>在类继承关系内移动成员</FONT></STRONG></SPAN></A></P>
<P>还有两个重构工具，Push Down 和 Pull Up，分别实现将类方法或者属性从一个类移动到其子类或父类中。假设您有一个名为 <CODE>Vehicle </CODE>的抽象类，其定义如清单5所示。 </P><BR><A name=N10170><B>清单 5. 抽象的 Vehicle 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public abstract class Vehicle
{
   protected int passengers;
   protected String motor;
   
   public int getPassengers()
   {
      return passengers;
   }
   public void setPassengers(int i)
   {
      passengers = i;
   }
   public String getMotor()
   {
      return motor;
   }
   public void setMotor(String string)
   {
      motor = string;
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>您还有一个 <CODE>Vehicle</CODE> 的子类，类名为 <CODE>Automobile</CODE> ，如清单6所示。 </P><BR><A name=N10185><B>清单6. Automobile 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public class Automobile extends Vehicle
{
   private String make;
   private String model;
   public String getMake()
   {
      return make;
   }
   public String getModel()
   {
      return model;
   }
   public void setMake(String string)
   {
      make = string;
   }
   public void setModel(String string)
   {
      model = string;
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>请注意， <CODE>Vehicle</CODE> 有一个属性是 <CODE>motor</CODE> 。如果您知道您将永远只处理汽车，那么这样做就好了；但是如果您也允许出现划艇之类的东西，那么您就需要将 <CODE>motor </CODE>属性从 <CODE>Vehicle</CODE> 类下放到 <CODE>Automobile </CODE>类中。为此，您可以在 Outline 视图中选择 <CODE>motor</CODE> ，然后选择 <B>Refactor &gt; Push Down</B>。 </P>
<P>Eclipse 还是挺聪明的，它知道您不可能总是单单移动某个属性本身，因此还提供了 <B>Add Required </B>按钮，不过在 Eclipse 2.1 中，这个功能并不总是能正确地工作。您需要验证一下，看所有依赖于这个属性的方法是否都推到了下一层。在本例中，这样的方法有两个，即与 <CODE>motor</CODE> 相伴的 getter 和 setter 方法，如图3所示。 </P>
<P><A name=figure3><B>图 3. 加入所需的成员</B> </A><BR><IMG height=427 alt="Adding required members" src="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/pushdown.gif" width=488> </P>
<P>在按过 <B>OK</B>按钮之后， <CODE>motor</CODE> 属性以及 <CODE>getMotor() </CODE>和 <CODE>setMotor()</CODE> 方法就会移动到 <CODE>Automobile</CODE> 类中。清单7显示了在进行了这次重构之后 <CODE>Automobile</CODE> 类的情形。 </P><BR><A name=N101E3><B>清单 7. 经过重构的 Automobile 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section><FONT face="Lucida Console">public class Automobile extends Vehicle
{
   private String make;
   private String model;
   protected String motor;
   public String getMake()
   {
      return make;
   }
   public String getModel()
   {
      return model;
   }
   public void setMake(String string)
   {
      make = string;
   }
   public void setModel(String string)
   {
      model = string;
   }
   public String getMotor()
   {
      return motor;
   }
   public void setMotor(String string)
   {
      motor = string;
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>Pull Up 重构与 Push Down 几乎相同，当然 Pull Up 是将类成员从一个类中移到其父类中，而不是子类中。如果您稍后改变主意，决定还是把 <CODE>motor</CODE> 移回到 <CODE>Vehicle</CODE> 类中，那么您也许就会用到这种重构。同样需要提醒您，一定要确认您是否选择了所有必需的成员。 </P>
<P><CODE>Automobile</CODE> 类中具有成员 motor，这意味着您如果创建另一个子类，比方说 <CODE>Bus</CODE> ，您就还需要将 <CODE>motor</CODE> （及其相关方法）加入到 <CODE>Bus</CODE> 类中。有一种方法可以表示这种关系，即创建一个名为 <CODE>Motorized </CODE>的接口， <CODE>Automobile</CODE> 和 <CODE>Bus</CODE> 都实现这个接口，但是 <CODE>RowBoat</CODE> 不实现。 </P>
<P>创建 <CODE>Motorized</CODE> 接口最简单的方法是在 <CODE>Automobile </CODE>上使用 Extract Interface 重构。为此，您可以在 Outline 视图中选择 <CODE>Automobile</CODE> ，然后从菜单中选择 <B>Refactor &gt; Extract Interface</B>。您可以在弹出的对话框中选择您希望在接口中包含哪些方法，如图4所示。 </P>
<P><A name=figure4><B>图 4. 提取 Motorized 接口</B> </A><BR><IMG height=391 alt="Motorized interface" src="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/motorized.gif" width=600> </P>
<P>点击 OK 之后，接口就创建好了，如清单8所示。</P><BR><A name=N10242><B>清单 8. Motorized 接口</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public interface Motorized
{
   public abstract String getMotor();
   public abstract void setMotor(String string);
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>同时， <CODE>Automobile</CODE> 的类声明也变成了下面的样子： </P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public class Automobile extends Vehicle implements Motorized
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P><A name=N10257><SPAN class=smalltitle><STRONG><FONT face=Arial>使用父类</FONT></STRONG></SPAN></A></P>
<P>本重构工具类型中最后一个是 User Supertyp Where Possible。想象一个用来管理汽车细帐的应用程序。它自始至终都使用 <CODE>Automobile</CODE> <CODE></CODE>类型的对象。如果您想处理所有类型的交通工具，那么您就可以用这种重构将所有对 <CODE>Automobile </CODE>的引用都变成对 Vehicle 的引用（参看图5）。如果您在代码中用 <CODE>instanceof</CODE> 操作执行了任何类型检查的话，您将需要决定在这些地方适用的是原先的类还是父类，然后选中第一个选项“Use the selected supertype in 'instanceof' expressions”。 </P>
<P><A name=figure5><B>图 5. 将 Automobile 改成其父类 Vehicle</B> </A><BR><IMG height=266 alt=Supertype src="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/supertype.gif" width=488> </P>
<P>使用父类的需求在 Java 语言中经常出现，特别是在使用了 Factory Method 模式的情况下。这种模式的典型实现方式是创建一个抽象类，其中具有静态方法 <CODE>create()</CODE> ，这个方法返回的是实现了这个抽象类的一个具体对象。如果需创建的具体对象的类型依赖于实现的细节，而调用类对实现细节并不感兴趣的情况下，可以使用这一模式。 </P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/#main"><B><FONT color=#996699>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=N10289><SPAN class=atitle><FONT face=Arial size=4>改变类内部的代码</FONT></SPAN></A></P>
<P>最大一类重构是实现了类内部代码重组的重构方法。在所有的重构方法中，只有这类方法允许您引入或者移除中间变量，根据原有方法中的部分代码创建新方法，以及为属性创建 getter 和 setter 方法。</P>
<P><A name=N10292><SPAN class=smalltitle><STRONG><FONT face=Arial>提取与内嵌</FONT></STRONG></SPAN></A></P>
<P>有一些重构方法是以 Extract 这个词开头的：Extract Method、Extract Local Variable 以及Extract Constants。第一个 Extract Method 的意思您可能已经猜到了，它根据您选中的代码创建新的方法。我们以清单8中那个类的 <CODE>main() </CODE>方法为例。它首先取得命令行选项的值，如果有以 -D 开头的选项，就将其以名-值对的形式存储在一个 <CODE>Properties</CODE> 对象中。 </P><BR><A name=N102A3><B>清单 8. main()</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">import java.util.Properties;
import java.util.StringTokenizer;
public class StartApp
{
   public static void main(String[] args)
   {
      Properties props = new Properties();
      for (int i= 0; i &lt; args.length; i++)
      {
         if(args[i].startsWith("-D"))
         {
           String s = args[i].substring(2);
           StringTokenizer st = new StringTokenizer(s, "=");
            if(st.countTokens() == 2)
            {
              props.setProperty(st.nextToken(), st.nextToken());
            }
         }
      }
      //continue...
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>将一部分代码从一个方法中取出并放进另一个方法中的原因主要有两种。第一种原因是这个方法太长，并且完成了两个以上逻辑上截然不同的操作。（我们不知道上面那个 <CODE>main() </CODE>方法还要处理哪些东西，但是从现在掌握的证据来看，这不是从其中提取出一个方法的理由。）另一种原因是有一段逻辑上清晰的代码，这段代码可以被其他方法重用。比方说在某些时候，您发现自己在很多不同的方法中都重复编写了相同的几行代码。那就有可能是需要重构的原因了，不过除非真的需要重用这部分代码，否则您很可能并不会执行重构。 </P>
<P>假设您还需要在另外一个地方解析名-值对，并将其放在 <CODE>Properties</CODE> 对象中，那么您可以将包含 <CODE>StringTokenizer</CODE> 声明和下面的 <CODE>if</CODE> 语句的这段代码抽取出来。为此，您可以高亮选中这段代码，然后从菜单中选择 <B>Refactor &gt; Extract Method</B>。您需要输入方法名称，这里输入 <CODE>addProperty</CODE> ，然后验证这个方法的两个参数， <CODE>Properties prop </CODE>和 <CODE>Strings</CODE> 。清单9显示由 Eclipse 提取了 <CODE>addProp() </CODE>方法之后类的情况。 </P><BR><A name=N102D6><B>清单 9. 提取出来的 addProp()</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">import java.util.Properties;
import java.util.StringTokenizer;
public class Extract
{
   public static void main(String[] args)
   {
      Properties props = new Properties();
      for (int i = 0; i &lt; args.length; i++)
      {
         if (args[i].startsWith("-D"))
         {
            String s = args[i].substring(2);
            addProp(props, s);
         }
      }
   }
   private static void addProp(Properties props, String s)
   {
      StringTokenizer st = new StringTokenizer(s, "=");
      if (st.countTokens() == 2)
      {
         props.setProperty(st.nextToken(), st.nextToken());
      }
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>Extract Local Variable 重构取出一段被直接使用的表达式，然后将这个表达式首先赋值给一个局部变量。然后在原先使用那个表达式的地方使用这个变量。比方说，在上面的方法中，您可以高亮选中对 <CODE>st.nextToken() </CODE>的第一次调用，然后选择 <B>Refactor &gt; Extract Local Variable</B>。您将被提示输入一个变量名称，这里输入 <CODE>key</CODE> 。请注意，这里有一个将被选中表达式所有出现的地方都替换成新变量的引用的选项。这个选项通常是适用的，但是对这里的 <CODE>nextToken() </CODE>方法不适用，因为这个方法（显然）在每一次调用的时候都返回不同的值。确认这个选项未被选中。参见图6。 </P>
<P><A name=figure6><B>图 6. 不全部替换所选的表达式</B> </A><BR><IMG height=271 alt="Extract variable" src="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/extractvariable.gif" width=569> </P>
<P>接下来，在第二次调用 <CODE>st.nextToken() </CODE>的地方重复进行重构，这一次调用的是一个新的局部变量 <CODE>value</CODE> 。清单10显示了这两次重构之后代码的情形。 </P><BR><A name=N1030F><B>清单 10. 重构之后的代码</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">private static void addProp(Properties props, String s)
   {
     StringTokenizer st = new StringTokenizer(s, "=");
      if(st.countTokens() == 2)
      {
         String key = st.nextToken();
         String value = st.nextToken();
        props.setProperty(key, value);
      }
   }
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>用这种方式引入变量有几点好处。首先，通过为表达式提供有意义的名称，可以使得代码执行的任务更加清晰。第二，代码调试变得更容易，因为我们可以很容易地检查表达式返回的值。最后，在可以用一个变量替换同一表达式的多个实例的情况下，效率将大大提高。</P>
<P>Extract Constant 与 Extract Local Variable 相似，但是您必须选择静态常量表达式，重构工具将会把它转换成静态的 final 常量。这在将硬编码的数字和字符串从代码中去除的时候非常有用。比方说，在上面的代码中我们用“-D”这一命令行选项来定义名-值对。先将“-D”高亮选中，选择 <B>Refactor &gt; Extract Constant</B>，然后输入 DEFINE 作为常量的名称。重构之后的代码如清单11所示： </P><BR><A name=N10322><B>清单 11. 重构之后的代码</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public class Extract
{
   private static final String DEFINE = "-D";
   public static void main(String[] args)
   {
      Properties props = new Properties();
      for (int i = 0; i &lt; args.length; i++)
      {
         if (args[i].startsWith(DEFINE))
         {
            String s = args[i].substring(2);
            addProp(props, s);
         }
      }
   }
   // ...
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>对于每一种 Extract... 类的重构，都存在对应的 Inline... 重构，执行与之相反的操作。比方说，如果您高亮选中上面代码中的变量 s，选择 <B>Refactor &gt; Inline...</B>，然后点击 <B>OK</B>，Eclipse 就会在调用 <CODE>addProp() </CODE>的时候直接使用 <CODE>args[i].substring(2) </CODE>这个表达式，如下所示： </P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section><FONT face="Lucida Console">        if(args[i].startsWith(DEFINE))
         {
            addProp(props,args[i].substring(2));
         }</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>这样比使用临时变量效率更高，代码也变得更加简要，至于这样的代码是易读还是含混，就取决于您的观点了。不过一般说来，这样的内嵌重构没什么值得推荐的地方。</P>
<P>您可以按照用内嵌表达式替换变量的相同方法，高亮选中方法名，或者静态 final 常量，然后从菜单中选择 <B>Refactor &gt; Inline...</B>，Eclipse 就会用方法的代码替换方法调用，或者用常量的值替换对常量的引用。 </P>
<P><A name=N1034A><SPAN class=smalltitle><STRONG><FONT face=Arial>封装属性</FONT></STRONG></SPAN></A></P>
<P>通常我们认为将对象的内部结构暴露出来是一种不好的做法。这也正是 <CODE>Vehicle</CODE> 类及其子类都具有 private 或者 protected 属性，而用 public setter 和 getter 方法来访问属性的原因。这些方法可以用两种不同的方式自动生成。 </P>
<P>第一种生成这些方法的方式是使用 <B>Source &gt; Generate Getter and Setter </B>菜单。这将会显示一个对话框，其中包含所有尚未存在的 getter 和 setter 方法。不过因为这种方式没有用新方法更新对这些属性的引用，所以并不算是重构；必要的时候，您必须自己完成更新引用的工作。这种方式可以节约很多时间，但是最好是在一开始创建类的时候，或者是向类中加入新属性的时候使用，因为这些时候还不存在对属性的引用，所以不需要再修改其他代码。 </P>
<P>第二种生成 getter 和 setter 方法的方式是选中某个属性，然后从菜单中选择 <B>Refactor &gt; Encapsulate Field</B>。这种方式一次只能为一个属性生成 getter 和 setter 方法，不过它与 <B>Source &gt; Generate Getter and Setter </B>相反，可以将对这个属性的引用改变成对新方法的调用。 </P>
<P>例如，我们可以先创建一个新的简版 <CODE>Automobile</CODE> 类，如清单12所示。 </P><BR><A name=N1036D><B>清单 12. 简单的 Automobile 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public class Automobile extends Vehicle
{
   public String make;
   public String model;
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>接下来，创建一个类实例化了 <CODE>Automobile</CODE> 的类，并直接访问 <CODE>make</CODE> 属性，如清单13所示。 </P><BR><A name=N10382><B>清单 13. 实例化 Automobile</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public class AutomobileTest
{
   public void race()
   {
      Automobilecar1 = new Automobile();
      car1.make= "Austin Healy";
      car1.model= "Sprite";
      // ...
   }
}</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>现在封装 <CODE>make</CODE> 属性。先高亮选中属性名称，然后选择 <B>Refactor &gt; Encapsulate Field</B>。在弹出的对话框中输入 getter 和 setter 方法的名称——如您所料，缺省的方法名称分别是 getMake() 和 setMake()。您也可以选择与这个属性处在同一个类中的方法是继续直接访问该属性，还是像其他类那样改用这些访问方法。（有一些人非常倾向于使用这两种方式的某一种，不过碰巧在这种情况下您选择哪一种方式都没有区别，因为 <CODE>Automobile </CODE>中没有对 <CODE>make</CODE> 属性的引用。） </P>
<P><A name=figure7><B>图7. 封装属性</B> </A><BR><IMG height=276 alt="Encapsulating a field" src="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/encapsulate.gif" width=504> </P>
<P>点击 <B>OK</B>之后， <B>Automobile</B> 类中的 <CODE>make</CODE> 属性就变成了私有属性，也同时具有了 <CODE>getMake() </CODE>和 <CODE>setMake() </CODE>方法。 </P>&gt; <BR><A name=N103C5><B>清单 14. 经过重构的 Automobile 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section><FONT face="Lucida Console">public class Automobile extends Vehicle
{
   private String make;
   public String model;

   public void setMake(String make)
   {
      this.make = make;
   }

   public String getMake()
   {
      return make;
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P><CODE>AutomobileTest</CODE> 类也要进行更新，以便使用新的访问方法，如清单15所示。 </P><BR><A name=N103D6><B>&gt;清单 15. AutomobileTest 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public class AutomobileTest
{
   public void race()
   {
      Automobilecar1 = new Automobile();
      car1.setMake("Austin Healy");
      car1.model= "Sprite";
      // ...
   }
}</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P><A name=N103E0><SPAN class=smalltitle><STRONG><FONT face=Arial>改变方法的签名</FONT></STRONG></SPAN></A></P>
<P>本文介绍的最后一个重构方法也是最难以使用的方法：Change Method Signature（改变方法的签名）。这种方法的功能显而易见——改变方法的参数、可见性以及返回值的类型。而进行这样的改变对于调用这个方法的其他方法或者代码会产生什么影响，就不是那么显而易见了。这么也没有什么魔方。如果代码的改变在被重构的方法内部引发了问题——变量未定义，或者类型不匹配——重构操作将对这些问题进行标记。您可以选择是接受重构，稍后改正这些问题，还是取消重构。如果这种重构在其他的方法中引发问题，就直接忽略这些问题，您必须在重构之后亲自修改。</P>
<P>为澄清这一点，考虑清单16中列出的类和方法。</P><BR><A name=N103EC><B>清单 16. MethodSigExample 类</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public class MethodSigExample
{
   public int test(String s, int i)
   {
      int x = i + s.length();
      return x;
   }
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>上面这个类中的 <CODE>test() </CODE>方法被另一个类中的方法调用，如清单17所示。 </P><BR><A name=N103FD><B>清单 17. callTest 方法</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">public void callTest()
   {
     MethodSigExample eg = new MethodSigExample();
     int r = eg.test("hello", 10);
   }</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>在第一个类中高亮选中 <CODE>test</CODE> ，然后选择 <B>Refactor &gt; Change Method Signature</B>。您将看到如图8所示的对话框。 </P>
<P><A name=figure8><B>图 8. Change Method Signature 选项</B> </A><BR><IMG height=514 alt="Change Method Signature options" src="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/changesig.gif" width=488> </P>
<P>第一个选项是改变该方法的可见性。在本例中，将其改变为 protected 或者 private，这样第二个类的 <CODE>callTest() </CODE>方法就不能访问这个方法了。（如果这两个类在不同的包中，将访问方法设为缺省值也会引起这样的问题。） Eclipse 在进行重构的时候不会将这些问题标出，您只有自己选择适当的值。 </P>
<P>下面一个选项是改变返回值类型。如果将返回值改为 <CODE>float</CODE> ，这不会被标记成错误，因为 <CODE>test() </CODE>方法返回语句中的 <CODE>int</CODE> 会自动转换成 <CODE>float</CODE> 。即便如此，在第二个类的 <CODE>callTest() </CODE>方法中也会引起问题，因为 <CODE>float</CODE> 不能转换成 <CODE>int</CODE> 。您需要将 <CODE>test() </CODE>的返回值改为 <CODE>int</CODE> ，或者是将 <CODE>callTest() </CODE>中的 <CODE>r </CODE>改为 <CODE>float</CODE> 。 </P>
<P>如果将第一个参数的类型从 <CODE>String</CODE> 变成 <CODE>int</CODE> ，那么也得考虑相同的问题。在重构的过程中这些问题将会被标出，因为它们会在被重构的方法内部引起问题： <CODE>int </CODE>不具有方法 <CODE>length()</CODE> 。然而如果将其变成 <CODE>StringBuffer</CODE> ，问题就不会标记出来，因为 <CODE>StringBuffer </CODE>的确具有方法 <CODE>length()</CODE> 。当然这会在 <CODE>callTest() </CODE>方法中引起问题，因为它在调用 <CODE>test() </CODE>的时候还是把一个 <CODE>String</CODE> 传递进去了。 </P>
<P>前面提到过，在重构引发了问题的情况下，不管问题是否被标出，您都可以一个一个地修正这些问题，以继续下去。还有一种方法，就是先行修改这些错误。如果您打算删除不再需要的参数 <CODE>i</CODE> ，那么可以先从要进行重构的方法中删除对它的引用。这样删除参数的过程就更加顺利了。 </P>
<P>最后一件需要解释的事情是 Default Value 选项。这一选项值仅适用于将参数加入方法签名中的情况。比方说，如果我们加入了一个类型为 <CODE>String </CODE>的参数，参数名为 <CODE>n</CODE> ，其缺省值为 <CODE>world</CODE> ，那么在 <CODE>callTest() </CODE>方法中调用 <CODE>test() </CODE>的代码就变成下面的样子： </P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section><FONT face="Lucida Console">      
         public void callTest()
   {
      MethodSigExample eg = new MethodSigExample();
      int r = eg.test("hello", 10, "world");
   }
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>在这场有关 Change Method Signature 重构的看似可怕的讨论中，我们并没有隐藏其中的问题，但却一直没有提到，这种重构其实是非常强大的工具，它可以节约很多时间，通常您必须进行仔细的计划才能成功地使用它。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/#main"><B><FONT color=#996699>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=N104AD><SPAN class=atitle><FONT face=Arial size=4>结束语</FONT></SPAN></A></P>
<P>Eclipse 提供的工具使重构变得简单，熟悉这些工具将有助于您提高效率。敏捷开发方法采用迭代方式增加程序特性，因此需要依赖于重构技术来改变和扩展程序的设计。但即便您并没有使用要求进行正式重构的方法，Eclipse 的重构工具还是可以在进行一般的代码修改时提供节约时间的方法。如果您花些时间熟悉这些工具，那么当出现可以利用它们的情况时，您就能意识到所花费的时间是值得的。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/#main"><B><FONT color=#996699>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=resources><SPAN class=atitle><FONT face=Arial size=4>参考资料 </FONT></SPAN></A></P>
<UL>
<LI>您可以参阅本文在 developerWorks 全球站点上的 <A href="http://www.ibm.com/developerworks/library/os-ecref/index.html"><FONT color=#5c81a7>英文原文</FONT></A>. <BR><BR>
<LI>有关重构的核心著作是 <I>Refactoring: Improving the Design of Existing Code，</I> 作者 Martin Fowler、Kent Beck、John Brant、William Opdyke 和 Don Roberts（Addison-Wesley，1999年）。 <BR><BR>
<LI>重构是一种正在发展的方法，在 <I>Eclipse In Action: A Guide for Java Developers</I> （Manning， 2003年）一书中，作者 David Gallardo，Ed Burnette 以及 Robert McGovern 从在 Eclipse 中设计和开发项目的角度讨论了这一话题。 <BR><BR>
<LI>模式（如本文中提到的 Factory Method 模式）是理解和讨论面向对象设计的重要工具。这方面的经典著作是 <I>Design Patterns: Elements of Reusable Object-Oriented Software</I>，作者为 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides （Addison-Wesley，1995年）。 <BR><BR>
<LI><I>Design Patterns </I>中的例子是用 C++ 写成的，这对于 Java 程序员是不小的障碍；Mark Grand 所著的 <I>Patterns in Java, Volume One: A Catalog of Reusable Design Patterns Illustrated with UML</I>（Wiley，1998年）将模式翻译成了 Java 语言。 <BR><BR>
<LI>有关敏捷编程的一个变种，请参看 Kent Beck 所著的 <I>Extreme Programming Explained: Embrace Change</I>（Addison-Wesley，1999年） <BR></LI></UL><B>Web 站点</B> 
<UL>
<LI><A href="http://www.refactoring.com/"><FONT color=#5c81a7>Martin Fowler 的个人网站</FONT></A>是 Web 上的重构技术中心。 <BR><BR>
<LI>有关用 JUnit 进行单元测试的更多信息，请访问 <A href="http://www.junit.org/"><FONT color=#5c81a7>JUnit 网站</FONT></A>。 <BR></LI></UL><B><I>developerWorks</I> <I></I>上的文章与教程 </B>
<UL>
<LI>Daniel H. Steinberg 撰写的“ <A href="http://www.ibm.com/developerworks/linux/library/l-eclipse.html"><FONT color=#5c81a7>Refactoring with Eclipse</FONT></A>”（ <I>developerWorks，</I>2001年11月）一文讨论了相关理论知识。 <BR><BR>
<LI>“ <A href="http://www.ibm.com/developerworks/cn/cnedu.nsf/java-onlinecourse-bytitle/5E86A3394F5A20DF48256B7A0011E4A6?OpenDocument"><FONT color=#5c81a7>Java 设计模式 101</FONT></A>” 是 David 撰写的有关模式的介绍性教程（ <I>developerWorks</I>，2002年1月）。 <BR><BR>
<LI>“ <A href="http://www.ibm.com/developerworks/cn/cnedu.nsf/java-onlinecourse-bytitle/D13115616809604348256BD8000AF725?OpenDocument"><FONT color=#5c81a7>Java 设计模式 201</FONT></A>”是 Paul Monday 编写的高级模式教程（ <I>developerWorks</I>，2002年4月）。 <BR><BR>
<LI>在“ <A href="http://www.ibm.com/developerworks/opensource/library/os-ecjdt/"><FONT color=#5c81a7>Extend Eclipse's Java Development Tools</FONT></A>”一文中，Dan Kehn 讨论了如何在 Eclipse 上扩展您自己的重构机制。（ <I>developerWorks</I>，2003年7月）。 <BR><BR>
<LI>在“ <A href="http://www.ibm.com/developerworks/opensource/library/os-ecov/"><FONT color=#5c81a7>Getting started with the Eclipse Platform</FONT></A>”一文中，David 为深入学习 Eclipse 提供了起点（ <I>developerWorks</I>，2002年11月）。 <BR><BR>
<LI>在“ <A href="http://www.ibm.com/developerworks/java/library/j-xp052703/"><FONT color=#5c81a7>Demystifying Extreme Programming</FONT></A>”一文中，Roy W. Miller 讨论了如何在 Eclipse 中使用 JUnit ( <I>developerWorks</I>,2003年5月）。 <BR><BR>
<LI>您可以在 <I>developerWorks 的</I> <A href="http://www-124.ibm.com/developerworks/oss/"><FONT color=#5c81a7>Open source projects zone</FONT></A> <A href="http://www-124.ibm.com/developerworks/oss/"></A>中找到有关 <A href="http://www.ibm.com/developerworks/views/opensource/articles.jsp?sort_order=desc&amp;expand=&amp;sort_by=Date&amp;show_abstract=false&amp;view_by=Eclipse&amp;search_by="><FONT color=#5c81a7>Eclipse</FONT></A> <A href="http://www.ibm.com/developerworks/views/opensource/articles.jsp?sort_order=desc&amp;expand=&amp;sort_by=Date&amp;show_abstract=false&amp;view_by=Eclipse&amp;search_by="></A>的更多文章。也可以参看 <I>alphaWorks</I> <I>上最新的 <A href="http://www.alphaworks.ibm.com/eclipse/"><FONT color=#5c81a7>Eclipse technology downloads</FONT></A>。 <BR></LI></UL><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/opensource/os-ecref/#main"><B><FONT color=#996699>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=author><SPAN class=atitle><FONT face=Arial size=4>关于作者</FONT></SPAN></A></P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD colSpan=2><FONT face=Arial size=4><IMG height=5 alt="" src="http://www.ibm.com/i/c.gif" width="100%"></FONT></TD></TR>
<TR vAlign=top align=left>
<TD>
<P><FONT face=Arial size=4></FONT></P></TD>
<TD>
<P>David Gallardo 是 <A href="http://www.studiob.com/"><FONT color=#5c81a7>Studio B</FONT></A> <A href="http://www.studiob.com/"></A>上的一名作家，他是一名独立软件顾问和作家，专长为软件国际化、Java Web 应用程序和数据库开发。他成为专业软件工程师已经有十五年了，他拥有许多操作系统、编程语言和网络协议的经验。他最近在一家 BtoB 电子商务公司 TradeAccess, Inc 领导数据库和国际化开发。在这之前，他是 Lotus Development Corporation 的 International Product Development 组中的高级工程师，负责为 Lotus 产品（包括 Domino）提供 Unicode 和国际语言支持的跨平台库的开发。David 是 <I>Eclipse In Action: A Guide for Java Developers</I>（2003年）一书的合著者。可以通过 <A href="mailto:david@gallardo.org"><FONT color=#5c81a7>david@gallardo.org</FONT></A> 与 David 联系。 </P></TD></TR></TBODY></TABLE></I></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/iNeo/aggbug/28305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iNeo/" target="_blank">只牵这只狗</a> 2006-01-17 15:28 <a href="http://www.blogjava.net/iNeo/archive/2006/01/17/28305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 运行命令行参数大全[转]</title><link>http://www.blogjava.net/iNeo/archive/2005/11/28/21679.html</link><dc:creator>只牵这只狗</dc:creator><author>只牵这只狗</author><pubDate>Mon, 28 Nov 2005 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/iNeo/archive/2005/11/28/21679.html</guid><wfw:comment>http://www.blogjava.net/iNeo/comments/21679.html</wfw:comment><comments>http://www.blogjava.net/iNeo/archive/2005/11/28/21679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iNeo/comments/commentRss/21679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iNeo/services/trackbacks/21679.html</trackback:ping><description><![CDATA[Eclipse 运行命令行参数大全&nbsp;&nbsp;<BR>&nbsp;&nbsp;包括英文版本和中文版本两种的说明, 特别需要值得一提的是那个 -nl 参数, 可以指定程序启动时所使用的语言. 例如:<BR>eclipse -nl en_US<BR>将启动英文语言, 这个特性在安装了国际化语言包以后特别有用, 可以方便的切换各个语言的版本. 注意 IBM WSAD v5.1 也支持这个功能. <BR><BR>运行 Eclipse<BR>将 Eclipse 驱动程序安装（解压缩）到某个目录（例如，c:\eclipse）中之后，通过运行顶级安装目录中的 Eclipse 可执行文件来启动"工作台"。在 Windows 系统上，该可执行文件称为 eclipse.exe，而在 Linux 系统上称为 eclipse。注意：下列讨论描述 Windows 系统上的设置。Linux 上的设置是相似的。<BR><BR>如果您没有另行指定，则平台将缺省工作区目录创建为可执行文件的兄弟目录（例如 c:\eclipse\workspace）。此工作区目录用作项目的缺省内容区，还用于保存任何必需的元数据。要进行共享安装或多工作区安装，应明确指出工作区的位置而不是使用缺省值。有两种控制工作区位置的方法：使用当前工作目录或使用 -data 命令行自变量。<BR><BR>将工作区位置设置为在当前工作目录内<BR>在此方案中，工作区位置将是当前工作目录中称为 workspace 的目录。<BR><BR>实现此目的最容易的方法可能是使用下列步骤来创建快捷方式：<BR><BR>导航到 Windows 资源管理器中的 eclipse.exe 并使用右键拖动来创建 eclipse.exe 的快捷方式。 <BR>编辑快捷方式的属性，以使启动位置：字段标识工作区位置的父目录（例如，c:\users\robert）。 <BR>关闭属性对话框并双击快捷方式（如果提供的目录为 c:\users\robert，则工作区位置将为 c:\users\robert\workspace）。 <BR>当然，您也可以使用命令提示符（通过将目录切换为工作区父目录然后运行 eclipse.exe）来获得同样的效果。<BR><BR>使用 -data 设置工作区的特定位置<BR>要使用 -data 命令行自变量，只要将 -data your_workspace_location（例如，-data c:\users\robert\myworkspace）添加至快捷方式属性中的目标字段或显式地将它包括在命令行上。<BR><BR>使用 -vm 设置 java VM<BR>建议显式指定在运行 Eclipse 时要使用哪个 Java VM。使用 -vm 命令行自变量（例如，-vm c:\jre\bin\javaw.exe）可以实现此目的。如果不使用 -vm，则 Eclipse 将使用在 O/S 路径上找到的一个 Java VM。当安装其它产品时，它们可更改您的路径，导致在下一次启动 Eclipse 时使用另一 Java VM。<BR><BR>运行 Eclipse 中的高级主题<BR>Eclipse 可执行文件及平台本身提供了人们感兴趣的开发或调试 Eclipse 各部件的许多执行选项。运行 Eclipse 可执行文件的一般格式是：<BR><BR>eclipse [platform options] [-vmargs [Java VM arguments]]<BR>Eclipse 启动参数&nbsp;&nbsp;命令 描述&nbsp;&nbsp;原因 <BR>-arch architecture<BR>定义 Eclipse 平台在其上运行的处理器体系结构。Eclipse 平台通常使用 Java os.arch 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOSArch() 用于插件。示例值有："x86"、"sparc"、"PA-RISC"和"ppc"。 2.0 <BR>-application applicationId<BR>要运行的应用程序。应用程序由向 org.eclipse.core.runtime.applications 扩展点提供扩展的插件来声明。通常不需要此自变量。如果指定了此项，则该值会覆盖配置提供的值。如果不指定此项，则会运行"Eclipse 工作台"。 1.0 <BR>-boot bootJarURL<BR>（建议不使用；用 -configuration 代替；支持 1.0 兼容）。Eclipse 平台的引导插件代码（boot.jar）的位置，表示为 URL。如果指定此项，则会用它来为装入 Eclipse 平台引导程序类装入器的类装入器设置类路径。仅当更改 startup.jar 和 boot.jar 的相对位置时才需要它。注意，不允许使用相对 URL。&nbsp;&nbsp;*1.0 <BR>-classloaderproperties [file]<BR>如果指定的话，则使用给定位置处的类装入器属性文件来激活平台类类装入器增强。文件自变量可以是文件路径或 URL。注意，不允许使用相对 URL。单击此处以获得更多详细信息。 2.0.2 <BR>-configuration configurationFileURL<BR>Eclipse 平台配置文件的位置，表示为 URL。配置文件确定 Eclipse 平台、可用插件集和主要功能部件的位置。注意，不允许使用相对 URL。当安装或更新 Eclipse 平台时配置文件被写至此位置。&nbsp;&nbsp;2.0 <BR>-consolelog<BR>将 Eclipse 平台的错误日志镜像到用来运行 Eclipse 的控制台。与 -debug 组合时很方便使用。 1.0 <BR>-data workspacePath<BR>要运行 Eclipse 平台的工作区的路径。工作区位置也是项目的缺省位置。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <BR>-debug [optionsFile]<BR>将平台置于调试方式，并从给定位置处的文件装入调试选项（如果指定的话）。此文件指示哪些调试点可用于插件以及是否已启用它们。如果未给出文件位置，则平台在启动 eclipse 的目录中查找称为".options"的文件。URL 和文件系统路径都可作为文件位置。 1.0 <BR>-dev [classpathEntries]<BR>将平台置于开发方式。将可选类路径条目（用逗号分隔的列表）添加至每个插件的运行时类路径。例如，当工作区包含要开发的插件时，指定 -dev bin 会为每个插件项目的名为 bin 的目录添加类路径条目，允许在其中存储最新生成的类文件。除去了冗余或不存在的类路径条目。 1.0 <BR>-endsplash params<BR>用于在 Eclipse 平台启动并运行时关闭闪屏的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <BR>-feature featureId<BR>主要功能部件的标识。主要功能部件为 Eclipse 的已启动实例提供了产品个性，并确定使用的产品定制信息。 2.0 <BR>-keyring keyringFilePath<BR>磁盘上授权数据库（或"密钥环"文件）的位置。此自变量必须与 -password 选项配合使用。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <BR>-nl locale<BR>定义 Eclipse 平台在其上运行的语言环境的名称。Eclipse 平台通常自动计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getNL() 用于插件。示例值有："en_US"和"fr_FR_EURO"。 2.0 <BR>-nolazyregistrycacheloading<BR>取消激活装入优化的平台插件注册表高速缓存。缺省情况下，仅当需要时才从注册表高速缓存（可用时）中装入扩展的配置元素，以减少内存占用。此选项将在启动时强制完全装入注册表高速缓存。 2.1 <BR>-noregistrycache<BR>绕过读写内部插件注册表高速缓存文件。 2.0 <BR>-nosplash<BR>运行平台而不显示闪屏。 1.0 <BR>-os operatingSystem<BR>定义 Eclipse 平台在其上运行的操作系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOS() 用于插件，并用于解析插件清单文件中提及的路径中 $os$ 变量的出现。示例值有："win32"、"linux"、"hpux"、"solaris"和"aix"。 1.0 <BR>-password password<BR>授权数据库的密码。与 -keyring 选项配合使用。 1.0 <BR>-perspective perspectiveId<BR>启动时要在活动工作台窗口中打开的透视图。如果没有指定该参数，则将打开关闭时活动的透视图。 1.0 <BR>-plugincustomization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propertiesFile<BR>包含插件首选项缺省设置的属性文件的位置。这些缺省设置覆盖在主要功能部件中指定的缺省设置。相对于从中启动 eclipse 的目录来解释相对路径。 2.0 <BR>-plugins pluginsFileURL<BR>（建议不使用；用 -configuration 代替；支持 1.0 兼容）。 指定 Eclipse 平台查找插件的文件的位置，表示为 URL。该文件为属性文件格式，其中键是任意用户定义名称，值是指向 plugin.xml 文件的显式路径或指向包含插件的目录的路径的用逗号分隔的列表。注意，不允许使用相对 URL。如果指定此项，则此选项会导致创建适当的临时配置。 *1.0 <BR>-refresh <BR>启动时执行工作区的全局刷新的选项。这将使从上次平台运行以来在文件系统中所做的任何更改一致。 1.0 <BR>-showlocation <BR>用于在窗口标题栏中显示工作区的位置的选项。在发行版 2.0 中，此选项仅与 -data 命令行自变量一起使用。 2.0 <BR>-showsplash params<BR>用于显示闪屏（由可执行的 Eclipse 平台启动器执行）的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <BR>-vm vmPath<BR>要用来运行 Eclipse 平台的"Java 运行时环境"（JRE）的位置。如果不指定此项，则 JRE 位于 jre（它是 Eclipse 可执行文件的兄弟目录）。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <BR>-ws windowSystem<BR>定义 Eclipse 平台在其上运行的 Windows 系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getWS() 用于插件、用于配置 SWT 以及用于解析插件清单文件中提及的路径中 $ws$ 变量的出现。示例值有："win32"、"motif"和"gtk"。 1.0 <BR><BR>将 -vmargs 条目后面的所有自变量（但不包括 -vmargs）作为虚拟机自变量（即，在要运行的类的前面）直接传递到所指示的 Java VM。注意：如果 Eclipse 启动在 Java vm 自变量（-vmargs）之后提供的自变量（例如，-data），则 Eclipse 将不会启动并且您将接收到"JVM 已终止。出口代码为 1"的错误。<BR><BR>在不同的 VM 上运行 <BR>在 J9 上运行 Eclipse<BR>当在 J9 版本 1.5 上运行 Eclipse 时，建议使用以下 VM 选项： <BR><BR>eclipse.exe [eclipse arguments] -vm path_to_j9w.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000<BR>当在 J9 版本 2.0 上运行 Eclipse 时，J9W 选择的缺省自变量应为合适的选项。但是，要覆盖 Eclipse 可执行文件以内部方式自动设置的参数，必须指定 -vmargs 不带任何参数，如下所示： <BR><BR>eclipse.exe [eclipse arguments] -vm path_to_j9w.exe -vmargs<BR>有关进一步信息，参考 J9 VM 文档和帮助。<BR><BR>在 IBM Developer Kit, Java(TM) Technology Edition VM 上运行 Eclipse<BR>IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺省 VM 设置适合进行初期研究工作，但在进行大型开发时是不够的。对于大型开发，应修改 VM 自变量以使有更多的堆可用。例如，下列设置将允许 Java 堆增大为 256MB：<BR><BR>-vmargs -Xmx256M <BR><!-- the post be hidden --><img src ="http://www.blogjava.net/iNeo/aggbug/21679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iNeo/" target="_blank">只牵这只狗</a> 2005-11-28 15:20 <a href="http://www.blogjava.net/iNeo/archive/2005/11/28/21679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>