伙计们,这是我的问题:我的项目中有很多地方使用过。而且我必须用提供的jar替换另一个类。有没有办法重构这个?我想这是一个简单的问题,但我不知道如何解决它。
它不是要替换源代码 - 我想要的是用我的库中的类替换所有类的用法,并能够完全删除我自己的类。想象一下,我已经创建了自己的StringUtils,并发现有一个apache.common StringUtils库,现在我想在我的代码中到处使用它。类方法的签名不是问题:它们是一致的。
答案 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)
我发现使用删除和重命名很容易:
答案 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上工作)。
祝你好运。