java

位置:IT落伍者 >> java >> 浏览文章

在Eclipse中创建新的重构功能(组图)


发布日期:2023年06月30日
 
在Eclipse中创建新的重构功能(组图)

介绍

重构在现代软件开发过程中扮演着重要的角色它能够减轻软件开发人员的工作负担提高软件开发的生产效率为了阐明重构的重要性我们在这里引用了developerWorks上David Carew提供的关于重构的教程中的一段话

现在一个开发者的工作大部分在于对现有的代码进行修改而不是起草写新的代码简单的修改可能包括对现有代码进行添加然而多样化的修改或扩展的改变会使软件内部结构开始恶化重构改变软件的内部结构使得软件更容易理解并且在不需要改变其显着的行为的情况下使得修改的代价也更小

在Java软件开发过程中通过使用Eclipse提供的重构工具我们至少获得了以下好处

最终产品更为健壮我们对程序代码的修改将不太可能出错出现遗漏修改的可能变少即使出现问题也能够通过Undo功能回退到重构前的状态

提高了生产效率通常一次重构能够完成对程序代码的多处改动最为明显的例子可能是Eclipse提供的Rename重构它能够在修改名称的同时相应的更改所有的引用

Eclipse为我们提供了多种实用的重构功能在软件开发过程中使用这些重构能够给我们带来极大的好处然而针对每个开发人员的特殊需要总有一些迫切需要的功能是不能通过已有的重构来获得的这个时候我们可以对Eclipse平台进行一些扩展创建适应我们自己需要的重构如果这个重构恰好能够符合大多数人的需要我们也可以像其他Eclipse的contributor一样将我们的重构贡献给Eclipse社区

接下来我们将通过一个例子来展示如何在Eclipse中创建新的重构功能我们这里创建的重构将用于迁移JUnit的测试用例我们知道在当前版本的JUnit中一个用于测试的函数必须以字符串test作为方法名称的开始而在即将来到的JUnit 一个@Test的Annotation被用于标明方法是一个测试方法我们将要创建的重构将完成这个迁移工作即在所有的以test开始的方法之前加上@Test标记@Test Annotation还可以包含一个timeout属性用来规定方法的最大执行时间我们在向导中提供了一个页面供用户选择是否需要timeout属性

结果预览

为了给读者一个直观的感受我们下面首先介绍本文中例子的实际运行效果在阅读完本文之后读者朋友也能够顺利的完成类似的功能

启动例子程序提供的Refactor之后我们获得了一个由三个页面组成的向导在第一个页面中用户可以选择是否需要timeout参数并且用户能够设置timeout参数的值

输入参数

当用户输入参数完毕之后通过单击Next按钮我们将进入下一个页面向导将进行初始条件检查和最终条件检查并将检查的结果反馈给用户在图 中我们可以看到初始条件和最终条件都正常因此我们可以进入下一步

显示条件检查

接下来是预览窗口(图 向导用直观的界面显示了在应用向导之后我们将会对源代码造成怎样的改动用户可以在这个页面中判断最终的修改是否符合自己的需要另外用户也能够选择性的取消对某些文件的修改

当用户检查预览页面确认没有问题之后用户可以按下Finish按钮从而完成重构这个时候源代码会发生修改最后的结果如下所示

清单

package main;

public class TestSomething {

@Test(timeout=)

public void testSomething(){

}

}

总体结构和流程

在Eclipse中一个重构操作主要由以下三个部分组成

RefactoringWizard类RefactoringWizard提供了向导式的用户界面来引导用户完成重构工作不需要我们做任何工作Eclipse已经通过RefactoringWizard为我们提供了预览页面条件检查页面以及Undo/Redo等功能我们需要继承这个类从而为重构过程提供特定的用户界面

Refactoring类Refactoring类完成具体的定位和修改代码功能为了建立新的Refactoring我们需要继承这个类并实现重构的逻辑部分

AST和ASTParser在Refactoring类中我们需要对代码进行定位和修改这可以通过AST机制来完成AST是abstract syntax tree的简称它能够将Java代码解析成为一个树形结构在利用了AST树之后对源代码的修改变成了对AST树的遍历更改节点属性以及插入和删除节点等

一个典型的重构操作流程如下所示

用户选择要进行重构的对象通过菜单项或按钮启动重构操作

创建具体的Refactoring类弹出RefactoringWizard

RefactoringWizard与用户交互引导用户输入必要的参数RefactoringWizard调用Refactoring类的函数进行条件检查

Refactoring类创建AST并利用其对源代码进行定位和修改这里进行的修改并不直接应用到源代码上而是被保存成Change对象供Refactoring框架使用

RefactoringWizard调用Refactoring类的函数获得重构内容的详细描述信息(即第步生成的Change对象)显示在预览界面上待用户确认

用户确认后Refactoring框架将修改代码重构操作结束

接下来我们将详细介绍新建重构类型的各个步骤

创建插件工程

在大家对整个系统构架有了一个大概的了解之后我们的介绍就从创建工程开始大家都知道Eclipse提供了很好的扩展性通过创建插件就能把我们要添加的重构功能无缝的插入到Eclipse平台中创建插件工程的方法在很多地方都有介绍这里不再详细讲解如果需要基础的插件开发知识我们可以参考《 开发 Eclipse 插件》树立基本的插件开发意识

通过菜单 File > New> Project选择Plugin Project点击Next出现对话框输入项目名称manageannotation接受其他选项的默认值点击Next出现插件属性设置的对话框继续接受默认值点击Next出现选择插件模板对话框该工程要在Refactor菜单中添加一个新的菜单项所以这里我们采用HelloWorld的插件模板点击Next修改Action类名称的值为AnnotationManageAction点击Finish按钮至此一个最基本Eclipse工作台的插件工程就被创建出来了

插件工程创建后缺省进入Plugin开发透视图Plugin Manifest编辑器自动打开显示这个插件工程的基本信息如对其他插件的依赖扩展点构建(build)的配置信息等等由于该工程需要用到其他插件的功能必须为其添加到其他插件的依赖在Plugin Manifest编辑器点击Dependencies页面在该页面中的Required Plugins列表中通过Add按钮添加如下的插件

清单

orgeclipsejfacetext

rerefactoring

orgeclipseltkuirefactoring

orgeclipsejdt

re

或者也可以通过直接修改MANIFESTMF文件完成操作完成后察看MANIFESTMF文件注意RequireBundle列表中是否出现了新添加的这几项MANIFESTMF文件如下

清单

ManifestVersion:

BundleManifestVersion:

BundleName: Annotation Plugin

BundleSymbolicName: manageannotation; singleton:=true

BundleVersion:

BundleActivator: manageannotationAnnotationPlugin

BundleLocalization: plugin

RequireBundle: orgeclipseui

reruntime

orgeclipsejfacetext

rerefactoring

orgeclipseltkuirefactoring

orgeclipsejdt

re

EclipseAutoStart: true

在Plugin Manifest编辑器中打开插件清单文件pluginxml可以看到这个插件扩展了orgeclipseuiactionSets扩展点这是一个基本的Eclipse工作台的扩展点通过扩展它插件可以很简单得对Eclipse的菜单工具条进行扩展这个pluginxml是HelloWorld插件模板的清单文件我们把它改成适合这个工程的文件清单如下

清单

<?xml version= encoding=UTF?>

<?eclipse version=?>

<plugin>

<extension

point=orgeclipseuiactionSets>

<actionSet

label=Annotation Action Set

visible=true

id=manageannotationactionSet>

<menu

label=%nulabel

path=source

id=orgeclipsejdnu>

<separator name=reorgGroup/>

</menu>

<action

class=manageannotationactionsAnnotationManageAction

icon=icons/samplegif

id=manageannotationactionsAnnotationManageAction

label=%Annotationmanage

menubarPath=orgeclipsejdnu/reorgGroup

toolbarPath=reorgGroup

tooltip=Manage Annotation in Java Project/>

</actionSet>

</extension>

</plugin>

该清单文件表明在Refactor菜单中添加了一个新菜单项Annotation Manage并在工具条上相应添加了一个按钮点击菜单项或者按钮的事件由类manageannotationactionsAnnotationManageAction处理

最后需要修改的就是manageannotationactionsAnnotationManageAction类它继承了orgeclipseuiIWorkbenchWindowActionDelegate接口该接口用于处理各种通过扩展点添加的操作当菜单项或者按钮被点击时这个类就被Eclipse工作台装载进来处理转发过来的请求以及接下来的操作

AnnotationManageAction被创建后一旦用户的选择部分有所改变接口的selectionChanged函数就会被触发告知用户所选择的部分可以在这个函数中根据用户的选择相应的修改操作的可用性或者其他显示属性例如在本文的工程中我们希望只有当用户选择了一个Java模型元素时才能使用这个操作那么就需要在selectionChanged中添加如下的代码

清单

public void selectionChanged(IAction action ISelection selection) {

if (selectionisEmpty())

select = null;

else if (selection instanceof IStructuredSelection) {

IStructuredSelection strut = ((IStructuredSelection) selection);

if (strutsize() != )

select = null;

if (strutgetFirstElement() instanceof IJavaElement)

select = (IJavaElement) strutgetFirstElement();

} else

select = null;

actionsetEnabled(select != null);

}

selectionChanged函数的参数selection记录了用户选择的部分我们首先判断它的选择部分的数目是否为一然后判断这个唯一的选择部分是否为Java模型元素这两个条件任何一个不满足都会导致actionsetEnabled(false)的执行这时会弹出如下的对话框说明操作不可用同时菜单项和按钮都会显示成灰色直到用户选择了合适的部分时菜单项和按钮才会实显就可以进行具体的操作了

表明Action目前不能执行的对话框

educitycn/img_///jpg >

操作的执行是在AnnotationManageAction的run函数中实现的例如在本文的工程中就是弹出RefactoringWizard对话框指导用户完成重构的工作这些我们将在下面的章节中讲述

扩展Refactoring类

通过前面系统构架的介绍大家知道了Refactoring和RefactoringWizard是完成EClipse重构功能的基础类在创建好插件工程后我们就通过扩展Refactoring来实现具体的功能

Refactoring是所有支持代码转化的类的抽象父类它在整个流程中与RefactoringWizard交互以完成重构的功能起着非常重要的作用这些类需要提供以下两类方法

用于条件检查的方法判断重构操作大体而言能否执行以及具体的转化能否完成创建Change对象的方法Change对象描述了所有将要执行的对当前代码的修改操作

Refactoring类的典型流程如下所示

具体的Refactoring类被创建

获得用户选择的要进行重构的对象初始化该Refactoring类这个由具体的实现类给出相应的方法

在重构操作开始执行时首先调用Refactoring的checkInitialConditions(IProgressMonitor) 基于用户选择的对象做一个的初始检查这个通常由界面自动执行返回RefactoringStatusFATAL表明初始检查没有通过重构操作不能继续

获得进行重构的其他参数比如对重命名操作来说就是指新名字这个通常是由界面根据用户的输入提供的由具体的实现类给出相应的方法

获得用户输入参数后调用Refactoring的checkFinalConditions(IProgressMonitor)进行剩下的检查这个通常由界面自动执行返回RefactoringStatusFATAL表明最后的检查没有通过重构操作不能继续

调用Refactoring的createChange(IProgressMonitor)获得Change对象这个通常由界面自动执行界面可以根据Change对象显示预览界面

基于以上的介绍为了实现本文工程中的重构操作我们需要扩展Refactoring类为它增加一个构造函数并且具体实现checkInitialConditionscheckFinalConditions和createChange三个函数

首先通过菜单File > New>Class弹出创建类的对话框输入包名manageannotationrefactor类名AnnotationRefactoring输入父类rerefactoringRefactoring选中继承抽象方法复选框点击完成按钮一个扩展了Refactoring的最基本的类AnnotationRefactoring就被创建出来了

首先为其增加构造函数以用户选择的Java模型元素作为参数Refactoring分析这个参数以得到所有相关的可写Java文件作为重构操作的对象如果该模型元素包含在Java文件中则找到包含它的文件节点如果该模型元素包含Java文件则找到它的所有子Java文件构造函数代码如下

清单

public AnnotationRefactoring(IJavaElement element) {

while (elementgetElementType() > IJavaElementCOMPILATION_UNIT) {

element = elementgetParent();

if (element == null)

return;

}

if (elementgetElementType() == IJavaElementCOMPILATION_UNIT) {

if (!elementisReadOnly())

compilationUnitsadd(element);

}

if (elementgetElementType() < IJavaElementCOMPILATION_UNIT)

findWritableCompilationUnits(element);

}

接着完成checkInitialConditions函数实现初始检查的具体操作作为示例在本文工程中我们不进行任何具体的检查操作只简单得给出初始检查成功的信息返回RefactoringStatus

INFO以使重构操作继续执行checkInitialConditions函数代码如下

清单

public RefactoringStatus checkInitialConditions(IProgressMonitor pm)

throws CoreException OperationCanceledException {

return RefactoringStatuscreateInfoStatus(Initial Condition is OK!);

}

接着完成checkFinalConditions函数实现获得用户输入参数后的后续检查操作在本文工程中我们首先收集所有需要添加注释的以test开头的方法判断是否不存在这样的方法如果不存在给出出错信息返回RefactoringStatusFATAL以结束重构操作如果存在这样的方法则给出后续检查成功的信息返回RefactoringStatus

INFOcheckFinalConditions函数代码如下

清单

public RefactoringStatus checkFinalConditions(IProgressMonitor pm)

throws CoreException OperationCanceledException {

collectChanges();

if (fChangeManagersize() == )

return RefactoringStatus

createFatalErrorStatus(No testing methods found!);

else return RefactoringStatuscreateInfoStatus(Final condition is OK!);

}

最后创建Change对象的createChange函数是整个重构操作中最核心的代码它的实现将在下面章节中介绍

使用AST构造Change对象

当我们找到了修改的位置时我们有两个选择

通过IScanner接口扫描代码然后通过IBuffer接口直接修改代码

通过遍历和编辑AST树进行结构化的修改

DeveloperWorks提供的文章《扩展Eclipse的Java开发工具》中给出了使用IBuffer接口的例子现在我们要讲述使用AST来遍历和修改Java源代码的方法

AST是abstract syntax tree的缩写它是Eclipse中的Java开发环境(JDT)为我们提供的极为强大的源代码解析和编辑工具

在使用AST树提供的功能之前我们首先要创建AST树由于AST树的构建是一项费时的操作JDT缺省情况下不将源代码解析为AST树下面的代码演示了获得一个ICompilationUnit对应的AST树的过程在JDT提供的API中ICompilationUnit接口用于表示一个可以被编译的源代码文件在我们提供的例子程序中我们通过下面的代码将整个文件解析成为了一颗AST树

清单

ASTParser parser = ASTParsernewParser(ASTJLS);

parsersetSource(cu);

ASTNode root = parsercreateAST(null);

AST树中的每个节点都是ASTNode类型通过Visit模式我们可以访问一个ASTNode包含的所有节点下面的代码演示了访问一个AST节点并获得其中所有的MethodDeclaration节点的方法

清单

private void getMethods(ASTNode cuu final List methods) {

cuuaccept(new ASTVisitor() {

public boolean visit(MethodDeclaration node) {

methodsadd(node);

return false;

}

});

}

在收集到了所有的MethodDeclaration节点之后我们就可以通过向AST树中插入和删除节点或者修改已有的节点的方法来修改AST树了下面的代码演示了使用AST工具为方法添加@Test Annotation的功能

清单

private boolean collectChanges(CompilationUnit root

MethodDeclaration method) {

if (methodgetName()getFullyQualifiedName()startsWith(test)) {

AST ast = methodgetAST();

if (needTimeout) {

NormalAnnotation na = astnewNormalAnnotation();

nasetTypeName(astnewSimpleName(Test));

MemberValuePair pair = astnewMemberValuePair();

pairsetName(astnewSimpleName(timeout));

pairsetValue(astnewNumberLiteral());

navalues()add(pair);

methodmodifiers()add( na);

} else {

MarkerAnnotation na = astnewMarkerAnnotation();

nasetTypeName(astnewSimpleName(Test));

methodmodifiers()add( na);

}

return true;

}

return false;

}

在Refactoring框架中我们要求对AST树的修改并不立刻反映到源代码中相反我们需要一个能记录整个修改过程的Change对象Refactoring框架将利用这个Change对象来显示Priveiw窗口进行Undo和Redo等操作大致上我们记录对一个AST树的修改从而生成Change对象的过程如以下代码所示

清单

rootrecordModifications();

//在这里修改AST树…

TextEdit edits = rootrewrite(document cugetJavaProject()

getOptions(true));

TextFileChange change = new TextFileChange( (IFile) cu

getResource());

changesetEdit(edits);

最后由于Refactoring类的createChange方法仅返回一个Change对象如果我们需要对多个源代码文件进行修改我们可以利用CompositeChange类将多个Change对象封装成一个Change对象这个过程可能类似如下代码所执行的流程

清单

public Change createChange(IProgressMonitor pm) throws CoreException

OperationCanceledException {

Change[] changes = new Change[fChangeManagersize()];

Systemarraycopy(fChangeManagertoArray() changes

fChangeManagersize());

CompositeChange change = new CompositeChange(

Add @Override Annotation changes);

return change;

}

扩展RefactoringWizard 框架

Eclipse中的RefactoringWizard框架扩展了Eclipse的Wizard框架关于Wizard框架的介绍可以在Eclipse的帮助系统中找到这里我们仅从OO设计和架构的角度探讨一下RefactoringWizard框架

我们从Wizard相关的几个类开始

WizardPage类

WizardPage是一个包含了多个界面元素(比如文本框Text按钮Button)的一个界面组合部分各个Page之间是独立的是可以动态加载的WizardPage类的职责有

组合SWT界面元素构造出一个界面页

定义本身界面元素的操作行为

在RefactoringWizard框架中预设了两个通用的属性页PreviewWizardPage和ErrorWizardPagePreviewWizardPage类是用来预览重构后的修改对比代码或其他资源的变化ErrorWizardPage类是用来处理条件检查及错误状态通知的我们只需扩展RefactoringWizard框架就可以自动获取这两项强大的功能

Wizard类

一个Wizard就是一个装载一系列WizardPage页的容器Wizard类的职责有

装载一系列WizardPage构造出一个复杂的界面

装载领域类来处理具体业务逻辑(在RefactoringWizard框架中这个类就是Refactoring类)

维护WizardPage页之间以及页与领域类之间的数据传递和状态共享(在这里要补充一点其实在具体RefactoringWizard框架的实现中有专门的类来分担这部分职责

我们的界面行为可以千变万化(通过组合不同的WizardPage)而负责处理业务逻辑的领域类也可以独立的变化你可以随意扩展Wizard的界面功能(-对扩展开放)而不用修改现有RefactoringWizard框架(-对修改封闭)这正是OO设计的最基本原则-OCP(OpenClose Principle)

WizardDialog类

这个对话框类的主要职责是构造一个完整的GUI界面以及操作界面它预设了一些按钮(BackNextFinishCancel)等界面元素它负责装载Wizard类操作时通过按钮BackNext来在多个WizardPage之间切换

下面我们给出RefactoringWizard框架的架构图

Refactoring Wizard架构图

educitycn/img_///gif >

从图 中我们可以看到如果我们把每一个WizardPage页看作一项业务那么Refactoring正是处理业务逻辑的控制中心它封装了所有对业务逻辑的处理当然它可以在将处理任务委任出去但请注意它并不负责实现业务流程也就是说各业务(各个Page界面)之间的逻辑顺序关系不由它维护

RefactoringWizard框架充分考虑到了应用的可扩展性它在SWT的MVC(模型-视图-控制)元架构模式的基础上添加了一些新的架构元素MVC模式促使业务逻辑与界面分离界面与控制行为分离而RefactoringWizard框架增强了界面本身分离的特性它将一个完整的界面分拆成多个页面用户可以动态组合这些页面或添加新的页面来扩展界面行为这种特性-界面的动态组合低耦合高内聚封装良好的接口-让我们领略到了OO设计的精髓

下面我们通过以下几个步骤来扩展RefactoringWizard框架

扩展RefactoringWizardPage

扩展RefactoringWizard

启动RefactoringWizard

第一步扩展RefactoringWizardPage首先我们新建一个类AnnotationRefactoringWizardPage它需要继承UserInputWizardPage类(其父类是RefactoringWizardPage而RefactoringWizardPage最终实现了IDialogPage接口)接下来就是实现IDialogPage接口的createControl(…)方法在这个方法里实现你的界面行为比如我们例子中的TimeOut文本框代码清单如下

清单

/**

* create composite to add UI elements

*/

public void createControl(Composite parent) {

// define UI

Composite composite = new Composite(parent SWTNONE);

GridLayout lay = new GridLayout();

laynumColumns = ;

compositesetLayout(lay);

btnCheck = new Button(composite SWTCHECK);

btnChecksetText(Add timeout parameter);

GridData gdBtnCheck = new GridData();

gdBtnCheckhorizontalSpan = ;

gdBtnCheckhorizontalAlignment = GridDataFILL;

btnChecksetLayoutData(gdBtnCheck);

labName = new Label(composite SWTWRAP);

labNamesetText(TimeOut:);

GridData gdLabName = new GridData();

gdLabNamehorizontalAlignment = GridDataBEGINNING;

gdLabNamegrabExcessHorizontalSpace = true;

labNamesetLayoutData(gdLabName);

txtTimeOut = new Text(composite SWTSINGLE | SWTBORDER);

GridData gdTxtTimeOut = new GridData();

gdTxtTimeOuthorizontalAlignment = GridDataEND;

gdLabNamegrabExcessHorizontalSpace = true;

txtTimeOutsetLayoutData(gdTxtTimeOut);

txtTimeOutsetText();

// init status

labNamesetEnabled(false);

txtTimeOutsetEnabled(false);

// add listener

defineListener();

// 将composite纳入框架的控制

setControl(composite);

DialogapplyDialogFont(composite);

}

在这里我们要特别注意的一点是在定义完我们的界面元素后需要将自定义的Composite纳入框架的控制就是这行代码setControl(composite);

在我们处理完输入数据检查后进入下一页面之前我们需要设置页面完成的状态以及传递输入数据到领域类Refactoring我们用以下代码设置好页面完成的状态后下个页面ErrorWizardPage就会处理显示逻辑

清单

private void notifyStatus(boolean valid String message) {

//设置错误信息

setErrorMessage(message);

//设置页面完成状态

setPageComplete(valid);

}

传递输入数据通过以下代码来处理

清单

private void setRefactoring(boolean selection String text) {

AnnotationRefactoring refactoring = (AnnotationRefactoring) getRefactoring();

refactoringsetNeedTimeout(true);

if(selection) {

refactoringsetTimeout(IntegervalueOf(txtTimeOutgetText())intValue());

}

}

其中getRefactoring()方法是继承自RefactoringWizardPage的方法由于我们的RefactoringWizard类装载了RefactoringWizardPage和Refactoring类这个方法是从RefactoringWizard类中获得的这里面用到了Observer设计模式至此我们完成RefactoringWizardPage的扩展

第二步扩展RefactoringWizard首先我们新建一个类AnnotationRefactoringWizard它需要继承RefactoringWizard类这个类中我们只需要加载定义好的AnnotationRefactoringWizardPage类和AnnotationRefactoring类当然复杂的处理已经有RefactoringWizard框架处理好了下面我们在构造函数中加载Refactoring类

清单

public AnnotationRefactoringWizard(Refactoring refactoring) {

super(refactoring WIZARD_BASED_USER_INTERFACE);

}

然后我们加载我们的AnnotationRefactoringWizardPage类只需重载父类RefactoringWizard的addUserInputPages()方法就可以

清单

protected void addUserInputPages() {

page = new AnnotationRefactoringWizardPage(refactor annotation);

addPage(page);

}

第三步启动RefactoringWizard扩展好RefactoringWizard之后就需要在用户点击菜单项或是按钮时弹出这个对话框RefactoringWizard最好使用RefactoringWizardOpenOperation类来打开(当然也可以用RefactoringWizardDialog)RefactoringWizardOpenOperation首先进行重构的初始检查通过后才打开RefactoringWinzard对话框否则就会打开错误对话框前面完成创建插件工程时我们提到弹出RefactoringWizard对话框的代码应该放到响应菜单操作的类的run函数中具体到本文工程中就是把下面的代码放到AnnotationManageAction的run函数中这些代码首先依次构造Refactoring和RefacoringWizard子类AnnotationRefactoring和AnnotationRefactoringWizard并将AnnotationRefactoring的引用传递给AnnotationRefactoringWizard然后用RefactoringWizardOpenOperation打开AnnotationRefactoringWizard弹出向导对话框

清单

public void run(IAction action) {

Shell shell = windowgetShell();

AnnotationRefactoring refactor = new AnnotationRefactoring(select);

AnnotationRefactoringWizard wizard = new AnnotationRefactoringWizard(

refactor);

RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(

wizard);

try {

oprun(shell Inserting @Override Annotation);

} catch (InterruptedException e) {

eprintStackTrace();

}

}

小结

在Eclipse中有效的利用重构能够大大的减轻软件开发人员的工作负担提高软件的健壮性然而目前重构仍然处在一个工具缺乏的时代以Eclipse为例只有JDT提供的重构工具最为完善而针对其他语言例如C++Python等的开发环境都缺乏对应的重构功能

通过本文提供的方法我们能够有效的利用Eclipse中的重构框架创建新的重构从而进一步提高已有开发环境的效率               

上一篇:Jython开发的JUnit测试包

下一篇:Jakarta Struts应用的七个经验(4)