首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java程序中标识符重命名

java程序中标识符重命名
EN

Stack Overflow用户
提问于 2010-08-18 03:56:07
回答 4查看 1.8K关注 0票数 3

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

代码语言:javascript
复制
public void doSomething(){
   int x = 10;
   int y = x * 2;
   int z = x + y;
}

将变量重命名(x重命名为a,y重命名为b,z重命名为c)后,我应该获得以下函数:

代码语言:javascript
复制
public void doSomething(){
   int a = 10;
   int b = a * 2;
   int c = a + b;
}

如何以编程方式实现这样的标识符及其引用的重命名?

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

请帮帮忙。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-16 07:54:07

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

代码语言:javascript
复制
RenameSupport renameSupport = RenameSupport.create(field, newName, RenameSupport.UPDATE_REFERENCES);
renameSupport.perform(workbench.getShell(), workbench);

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

票数 0
EN

Stack Overflow用户

发布于 2010-08-20 07:10:39

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

  1. 使用Java反射API java.lang.reflect来标识在特定类中定义的所有方法,这些方法需要跨所有方法的局部变量renaming.
  2. Iterate。对于每个方法,使用org.eclipse.jdt.core API向下遍历编译元素的层次结构,选择局部作用域的变量定义。获取编译单元的变量名称。
  3. 将生成新的变量名称。例如: Old ==> OldRenamed。此时,应用您希望的任何重命名启发式方法。
  4. 调用org.eclipse.jdt.ui.refactoring开发工具包Eclipse方法在方法中进行变量重命名。通过使用此API,您将有效地调用Eclipse变量功能。

这应该能起到作用。

票数 1
EN

Stack Overflow用户

发布于 2010-08-18 10:01:49

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

  1. 创建定义搜索和replace.
  2. Annotate源代码的注释。你可以创建一个源文件Trees.instance method.
  3. You -info.java并在包级别进行注释。
  4. 你的处理器可以通过Compiler Tree API扩展SimpleTreeVisitor来执行实际的复制。这将是单调乏味的,但不是很complicated.

我能想到的唯一用例是,您已经准备了具有人类语言A(例如,日语)中有意义的变量名称的源代码,并且您希望与听众(老板、学生、客户等)讨论它。更熟悉人类语言B的人(例如阿拉伯语)

除此之外,我想不出有什么好的理由去这么麻烦。在给定的示例中,x、y和z是局部变量。既然范围这么小,真的没有必要重新命名。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3506397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档