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

时间:2011-09-27 09:01:59

标签: java eclipse refactoring automation

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

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

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

public class MyContainer<T> {
    private final T content;

    public MyContainer(final T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

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

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

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

<?xml version="1.0" encoding="UTF-8"?>
<session version="1.0">
<refactoring comment="Introduce factory &apos;holding&apos; in &apos;scratch.MyContainer&apos; for constructor &apos;scratch.MyContainer.MyContainer()&apos;&#x0A;- Original project: &apos;scratch&apos;&#x0A;- Original element: &apos;scratch.MyContainer.MyContainer()&apos;&#x0A;- Factory name: &apos;holding&apos;&#x0A;- Owner class: &apos;scratch.MyContainer&apos;"
             description="Introduce factory for &apos;MyContainer&apos;"
             element1="/src&lt;scratch{MyContainer.java[MyContainer"
             flags="589830" id="org.eclipse.jdt.ui.introduce.factory"
             input="/src&lt;scratch{MyContainer.java"
             name="holding" project="scratch" protect="false"
             selection="89 0" version="1.0"/>
</session>

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

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

  

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

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

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

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

注3:甚至可以通过调用此方法来手动指定“使用此构造函数替换对象X的实例化”,这将是一种方法。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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