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