有没有办法在Intellij Idea中用另一个替换类?

时间:2011-10-28 09:25:42

标签: java refactoring intellij-idea

伙计们,这是我的问题:我的项目中有很多地方使用过。而且我必须用提供的jar替换另一个类。有没有办法重构这个?我想这是一个简单的问题,但我不知道如何解决它。

它不是要替换源代码 - 我想要的是用我的库中的类替换所有类的用法,并能够完全删除我自己的类。想象一下,我已经创建了自己的StringUtils,并发现有一个apache.common StringUtils库,现在我想在我的代码中到处使用它。类方法的签名不是问题:它们是一致的。

5 个答案:

答案 0 :(得分:21)

" migrate" 功能。右键单击任何类 - >重构 - >迁移。

您必须创建新的迁移集并且无法从头开始运行它,这有点令人讨厌。但它完全符合您的需求。

选择要迁移的类或包并告诉它应该更改哪个类或包。按下运行并重写所有用法。然后你可以自由删除旧班级,因为没有用法。

干杯!

答案 1 :(得分:3)

如果您正在使用静态方法(如您的StringUtils示例所示),请委托您之前实现中的新类,如

public static String myOldMethod(String argument) {
    return MyNewClass.myNewMethod(argument);
}

然后选择Refactor-> Inline并在选项对话框中选择“All invocations并删除方法”。通过这种方式,您可以处理方法名称更改,并且参数顺序更改也很顺利。

答案 2 :(得分:1)

最简单的方法是编写一个映射您想要内联的方法。

假设您有方法

enum MyStringUtils {
  public static boolean containsAnyCase(String searchFor, String searchIn) {
      // something
  }
}

// calling code
boolean found = MyStringUtils.containsAnyCase(find, in);

您想使用StringUtils.containsIgnoreCase但是类名,方法名和顺序参数是不同的。

所以你改变方法的主体来代替调用所需的方法。

  public static boolean containsAnyCase(String searchFor, String searchIn) {
      return StringUtils.containsIgnoreCase(searchIn, searchFor);
  }

选择方法和< Crtl> +< Alt> + N.这将提供在任何地方内联此方法并删除您的方法。您的来电者现在看起来像

  boolean found = StringUtils.containsIgnoreCase(in, find);

即使原始类使用方法的import,方法的import static或根本没有导入,这也会有效。

答案 3 :(得分:0)

我发现使用删除和重命名很容易:

  • 暂时删除TargetClass(删除后不使用)。
  • 根据用法将SourceClass重命名为TargetClass。
  • 从VCS或本地历史记录中恢复TargetClass。

答案 4 :(得分:-1)

虽然我不是IntelliJ的专家,但我可以告诉你,通常在java中,类加载是按顺序完成的。我的意思是类加载器正在按顺序查找类,因此如果同一个类在类路径中多次出现,则需要第一个版本。

所以,这取决于你如何运行你的应用程序。例如,如果您使用的命令行如java -cp lib.jar;myapp.jar com.mycompany.Main,并且lib.jar和myapp.jar都包含相同的类Util,则将使用lib.jar版本。

如果要在从IDE运行时获得相同的效果,请尝试检查项目属性。您可以相对于项目的类控制库jar的顺序吗?如果没有,可能您可以将jar添加到bootstrap类路径。在这种情况下,将lib.jar添加到bootstrap类路径(只是为了在IDE上工作)。

祝你好运。