【问题标题】:Eclipse: Programmatically manipulate classEclipse:以编程方式操作类
【发布时间】:2018-04-23 19:42:51
【问题描述】:

我刚刚遇到了一个问题,即我有 10 个(左右)Java 类来满足我的所有需求:

  1. 在其构造函数中添加形式参数“String newparam”
  2. 将此作为实际参数添加到对超类构造函数的 super() 调用(因此,结果应该是 super(..., newparam))。

原因很明显,这些类的公共超类现在多了一个构造函数参数,所有扩展类都必须适应。

我简直不敢相信我需要为所有课程手动执行此操作。 Eclipse 必须在其内部包含所有必需的概念,例如“构造函数”、“参数”等。有什么方法可以为此创建脚本?

如果这是微不足道的/众所周知的,我深表歉意,我不得不承认我真的不知道并且感谢任何提示。

【问题讨论】:

  • 我不确定我是否理解。你可以编写一个简单的 java 应用程序来编辑你所有的 java 文件。打开每个文件 *.java,提取类名,插入新参数,...您可以通过正则表达式完成所有这些操作。
  • 我会感到震惊的是,没有人尝试在 Eclipse 上开发一个模块来进行这样的更新,但使用起来可能会很棘手,尤其是对于只有 10 个类的情况 ;)

标签: java eclipse automation


【解决方案1】:

更改每个子类的构造函数签名可能必须使用某种脚本来完成。我认为 IDE 不会在每个构造函数中自动推断新参数,因为每个子类可能会以不同的方式使用新参数。

由于您使用的是 Eclipse,您可以通过选择超类的构造函数并点击 alt+shift+c(重构的快捷方式 -> 更改方法签名...)来略过第二个要求。

当您通过提供的 GUI 添加参数时,对该构造函数的所有引用(例如扩展类中的 super 调用)也将被更新。如果需要,您甚至可以定义默认值。 然后,如果需要,您可以修改每个扩展类的构造函数,使其也包含新参数(遗憾的是手动)。

【讨论】:

  • 非常感谢,我其实从来没有注意到“更改方法签名”重构,所以我今天明确地学到了一些新东西。它不会解决问题,但会朝着正确的方向发展。
【解决方案2】:

感谢您的 cmets 和答案。目前似乎没有(广泛)已知的 Eclipse 内置方法来做我想做的事。 简而言之:

向超类添加一个新的构造函数参数,同时, 创建 所有扩展类的构造函数中的相同参数并传递 this 参数传递给超类构造函数

需要注意的是,函数

向超类添加一个新的构造函数参数,并将该参数的默认值添加到所有扩展类

通过refactor -> Change method signature... 工作(感谢@Zircon)。

如果你真的有很多类,一个相当明显的解决方案是编写一个脚本。 brahimfes 提出了一个 Java 类,它的优点是不需要新的语言或新的工作环境,因为我的问题是特定于 Java 的。我还认为也许 sed 脚本可以解决问题。然而,我确实没有尝试,首先,识别正确的行(构造函数和超类构造函数调用,即使第二个是微不足道的),其次,确定添加参数的正确位置,第三,实际添加它们.可能有效,我没有尝试,我只是怀疑你会在这样的脚本上工作多长时间直到它没有错误地工作。

现在我终于找到了解决方案。 我意识到我在每个子类中总是有相同的击键(在我手动将新参数添加到超类构造函数之后):

  1. 选择构造函数行。
  2. 将光标放在 and 和 backtrack 3 个位置(括号)。
  3. 添加形参。
  4. 下一行。
  5. 转到这一行的末尾(总是恰好是 super() 调用)并回溯一个位置。
  6. 添加实际参数。

有一些程序允许创建这种类型的 makros,我得到了其中一个的试用版(我在 Mac 上)并这样做了。

当然,这实际上仍然不是我问题的解决方案,因此我不会将这篇文章标记为解决方案。虽然我现在有一个 makro,可以让我几乎不用打字,但我仍然必须手动打开编辑器中的每个类,单击正确的行,然后触发 makro。 这个程序仍然会在未来为我节省类似要求的时间。但这不是我希望的那样,它将是一些 Eclipse 内置的脚本语言,可以访问 Java 语法元素,从而实现比正则表达式提供的更高级的访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2017-12-14
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多