java程序中的标识符重命名

java程序中的标识符重命名,java,eclipse-plugin,identifier,renaming,Java,Eclipse Plugin,Identifier,Renaming,我需要以编程方式重命名给定范围内的标识符,例如,java程序中的方法。例如,给定以下java函数: public void doSomething(){ int x = 10; int y = x * 2; int z = x + y; } public void doSomething(){ int a = 10; int b = a * 2; int c = a + b; } 重命名变量(x为a,y为b,z为c)后,我应获得以下函数: public v

我需要以编程方式重命名给定范围内的标识符,例如,java程序中的方法。例如,给定以下java函数:

public void doSomething(){
   int x = 10;
   int y = x * 2;
   int z = x + y;
}
public void doSomething(){
   int a = 10;
   int b = a * 2;
   int c = a + b;
}
重命名变量(x为a,y为b,z为c)后,我应获得以下函数:

public void doSomething(){
   int x = 10;
   int y = x * 2;
   int z = x + y;
}
public void doSomething(){
   int a = 10;
   int b = a * 2;
   int c = a + b;
}
如何以编程方式实现标识符及其引用的重命名

我一直在研究EclipseAST和Java模型。无论哪种情况,我都必须实现对任何给定标识符的所有匹配项的搜索,然后替换它们。我想知道是否有更好的方法来实现这一点(Eclipse重构UI如何支持这种变量重命名)?或者,我应该看看语言工具包(org.eclipse.ltk.core.refactoring)吗?有教程、示例代码或建议吗

请帮忙。

  • 选择变量
  • 单击鼠标右键
  • 选择重构
  • 选择“重命名”
  • 重命名变量

Eclipse将在它使用的所有地方重命名这个变量

我真的怀疑这样做是否明智,但是可以使用注释处理器来完成。您必须接受注释处理器不能修改现有源代码,但可以创建基本上是原始源代码克隆的新源代码(重命名除外)

  • 创建用于定义搜索和替换的注释
  • 注释你的源代码。您可以创建一个源文件package-info.java,并在包级别进行注释
  • 您的处理器可以通过使用
  • 您可以扩展以进行实际复制。这将是乏味的,但不是很复杂
  • 我能想到的唯一一个使用案例是,您已经准备好了使用人类语言A(例如日语)有意义的变量名的源代码,并且您希望与更熟悉人类语言B(例如阿拉伯语)的听众(老板、学生、客户等)进行讨论


    除此之外,我想不出任何好的理由去惹这么多麻烦。在给出的示例中,x、y和z是局部变量。由于作用域很小,因此确实不需要重命名。

    我不清楚您是希望全面(即所有类中的所有方法)执行此重命名,还是仅对手动识别的特定类执行此重命名。假设是后者,我建议您:

  • 使用Java反射API Java.lang.reflect来标识特定类中定义的所有需要本地 变量重命名
  • 迭代所有方法。对于每个方法,使用org.eclipse.jdt.core API向下遍历编译元素的层次结构,选择局部范围的变量定义。获取对象的变量的名称 汇编股
  • 生成新的变量名。类似于:Old==>OldRenamed。此时,应用您希望的任何重命名启发
  • 调用Eclipse开发工具包org.Eclipse.jdt.ui.refactoring API方法来进行变量重命名 在方法内部。实际上,您将调用Eclipse重命名变量功能 使用此API进行无头访问

  • 这应该可以解决问题。

    我可以使用以下代码重命名

    RenameSupport renameSupport = RenameSupport.create(field, newName, RenameSupport.UPDATE_REFERENCES);
    renameSupport.perform(workbench.getShell(), workbench);
    

    但它将更改应用于实际的源文件。有什么可以预防的吗?我只需要内部重命名的代码,不能更改实际的源代码

    非常感谢您的回复。如果我理解了你的建议,你建议对源代码进行注释。不幸的是,我不能使用编辑器UI编辑源代码,因此我的用例不允许注释源代码。我正在尝试使用“org.eclipse.jdt.internal.corext.refactoring.rename.RenameLocalVariableProcessor”。但是,为了实例化这个类,我需要传递一个实现“org.eclipse.jdt.core.ILocalVariable”接口的对象。文档中说,“ILocalVariable是作为ICodeAssist.codeSelect(…)操作的结果创建的伪元素。它们不是Java模型的一部分,也不包含在IMethod或IInitializer的子级中。”那么我如何获得ILocalVariable的实例呢?哦,这太简单了。调用ICompilationUnit.codeSelect(…)将完成此任务。