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

Java 在Intellij Idea中有没有办法用另一个类替换类?,java,refactoring,intellij-idea,Java,Refactoring,Intellij Idea,伙计们,这是我的问题:我有一些类在我的项目中的许多地方都使用。我必须用jar提供的另一个类替换这个类。有没有办法重构这个?我想这是一个简单的问题,但我不知道如何解决它 这与替换源代码无关——我想要的是从我的库中按类替换所有的类用法,并能够完全删除我自己的类。假设我创建了自己的StringUtils,并且发现有一个apache.common StringUtils库,现在我想在代码中的任何地方都使用它。类方法的签名也不是问题:它们是一致的 ?尽管我不是IntelliJ方面的专家,但我可以告诉您,在

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

这与替换源代码无关——我想要的是从我的库中按类替换所有的类用法,并能够完全删除我自己的类。假设我创建了自己的StringUtils,并且发现有一个apache.common StringUtils库,现在我想在代码中的任何地方都使用它。类方法的签名也不是问题:它们是一致的


尽管我不是IntelliJ方面的专家,但我可以告诉您,在java中,类加载通常是按顺序进行的。我的意思是类加载器正在按顺序查找类,因此,如果同一个类在类路径中多次出现,那么它将使用第一个版本

因此,这取决于您如何运行应用程序。例如,如果您正在使用命令行,如
java-cp lib.jar;myapp.jar com.mycompany.Main
,lib.jar和myapp.jar都包含相同的类,将使用lib.jar版本

如果希望在从IDE运行时获得相同的效果,请尝试检查项目属性。也许您可以控制库JAR相对于项目类的顺序?如果没有,您可能可以将JAR添加到引导类路径。在本例中,将lib.jar添加到引导类路径(仅用于IDE)


祝你好运

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

说你有办法

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);
  }
选择方法和++N。这将提供在任何地方内联此方法并删除您的方法。你的来电者现在看起来像

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

即使原始类使用类的
import
、方法的
import static
或根本不导入,这也会起作用。

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

public static String myOldMethod(String argument) {
    return MyNewClass.myNewMethod(argument);
}
然后选择重构->内联,并在选项对话框中选择“所有调用和删除方法”。通过这种方式,您可以很好地处理方法名称更改和参数顺序更改。

这里有一个“migrate”函数。右键单击任意类->重构->迁移

您必须创建一个新的迁移集,而不能从头开始运行它,这有点烦人。但它正是你所需要的

选择要迁移的类或包并告诉它应该更改到哪个类或包。按run键,所有用法都被重写。然后您可以自由地删除旧类,因为它没有任何用途

编辑:在较新版本中,它不再位于上下文菜单中。只需进入顶部的菜单-重构-迁移(或者只需按住shift键两次并键入Migrate)


干杯

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

  • 暂时删除TargetClass(删除时不使用)
  • 使用usages将SourceClass重命名为TargetClass
  • 从VCS或本地历史记录还原TargetClass

import语句上的全局替换就可以了。全局替换只在类的名称相同时才起作用。所以我想它可能会回答这个特定的案例,但不会回答“问题”…工具很好,但对于IntelliJ助手来说,这是一个令人惊讶的手工劳动。我一直认为这些“迁移”是固定的,从来没有想过它们可以像这样定制。。。不是这里最好的用户体验设计,-)太棒了…它工作得很好。。。非常感谢!!!。。