有没有办法为其副作用应用重构脚本?

我有一个库被更改为引入工厂方法来替换构造函数(原因现在并不重要,在目前的情况下,它主要用于改进类型推断)。

假设有一个Eclipse重构脚本(所以我几乎有一个很好的计算机可读描述的变化),有没有办法将该脚本应用于只使用该库的项目(即它只有一个参考到库的编译版本)?

例如,我从这个简单的类开始:

public class MyContainer { private final T content; public MyContainer(final T content) { this.content = content; } public T getContent() { return content; } } 

现在我介绍一个工厂(没有将构造函数设为私有,但现在并不是真正相关),工厂方法如下所示:

 public static  MyContainer holding(T content) { return new MyContainer(content); } 

当我现在导出迁移脚本时,它看起来像这样:

     

应该包含足够的信息以将重构应用于另一个通过jar文件引用类( 当前版本)的项目。

但是尝试应用重构会给我这个错误:

无法执行refatoring’Introduce Factory’(org.eclipse.jdt.ui.introduce.factory),因为它的输入’scratch.MyContainer.java’不存在。

请注意,它明确提到.java ,因此它正在寻找源文件,并不满足于将重构应用于二进制类型。

注意:我不想修补二进制库。 我只想将原始构造函数的调用者转换为调用工厂方法。

注意2:在我的具体情况下,搜索和替换将无济于事。 原因是我有两个构造函数,一个使用Object ,另一个使用String 。 它们应该映射到两个不同的工厂方法,所以我需要搜索和替换函数来查看参数的类型信息。

注3:即使是一种手动指定“用此构造函数替换对象X实例化而不是调用此方法”的方法也将受到赞赏。

更新: Eclipse bugzilla上有一个关于添加替换调用重构的bugzilla条目。 如果“调用”包括通过给定构造函数的对象实例化,那么该function的实现可能能够解决我的问题。 不幸的是,它在过去几年中没有看到任何活动(虽然计划在3.2)。

这不是仅将重构应用于调用者的方法,但它可能会让您解决问题。

是否可以向您的项目添加一个假的MyContainer.java文件,该文件具有与库中相同的签名,应用您的重构然后丢弃Java文件? 您甚至可以使用反编译的源,但您可能必须自己进行生成。

我想你必须编写自己的重构插件。 org.eclipse.jdt.ui.tests.refactoring的测试是一个有趣的起点。

关于该主题的一些有趣的读物: