Java 如何跨文件提取方法?
在项目的所有java文件中,我希望替换以下内容:Java 如何跨文件提取方法?,java,intellij-idea,refactoring,structural-search,Java,Intellij Idea,Refactoring,Structural Search,在项目的所有java文件中,我希望替换以下内容: myObject.getName() == null 因此: myObject.hasName() IntelliJ IDEA是否有任何行动或策略可以做到这一点 我希望它对我的类MyClass的getName方法是特定的,而不是替换代码,它引用了其他类的getName方法 我希望它能找到尽可能多的匹配项。它不应该关心其他空格、换行符等。如果变量有其他名称(如myObj或objX),则也应该起作用。还应该找到像getObject().getN
myObject.getName() == null
因此:
myObject.hasName()
IntelliJ IDEA是否有任何行动或策略可以做到这一点
- 我希望它对我的类
的MyClass
方法是特定的,而不是替换代码,它引用了其他类的getName
方法getName
- 我希望它能找到尽可能多的匹配项。它不应该关心其他空格、换行符等。如果变量有其他名称(如
或myObj
),则也应该起作用。还应该找到像objX
这样的调用。(搜索必须关注语义)getObject().getName()
- 我希望它是快速的,而不是要求我一个接一个地进行数百场比赛
替换指定路径内所有文件中的一段文本
- 在主菜单上,选择编辑|查找|替换路径
- 按Ctrl+Shift+R组合键
- 在“在路径中查找”对话框中,按Ctrl+Shift+R切换到“在路径中替换”对话框
- 如果通过正则表达式指定搜索和/或替换文本,请在反向引用中使用
格式(以引用以前找到并保存的模式)$n
- 若要在正则表达式中使用反斜杠字符
,请通过在介词\
中插入三个额外的反斜杠来转义有意义的反斜杠\\\\\
同时,IntelliJ IDEA打开“替换用法”对话框,标题栏中显示了所遇到事件的完整路径: 执行以下操作之一:
- 要替换选定的引用,请单击“替换”
- 要保留所选事件并移动到下一个事件,请单击“跳过”
- 要替换当前活动选项卡中出现的所有搜索字符串,请单击此文件中的全部替换
- 要保留当前活动选项卡(任意)中出现的搜索字符串并移动到下一个文件,请单击“跳到下一个文件”
- 要替换所有检测到的事件,请单击所有文件
- 要切换到手动模式,请单击预览。替换用法对话框关闭,焦点移动到查找工具窗口。执行以下操作之一:
- 浏览检测到的事件列表,选择要替换的事件,然后单击替换所选事件
- 要更改所有引用,请单击“全部替换”
public boolean hasName() {
return getName() == null;
}
private boolean hasName(MyClass myObject) {
return myObject.getName() == null;
}
- 为此,我建议选择
,然后使用操作Refactor | Extract | Method…和Refactor | Move…,这样就不必键入任何代码myObject.getName()==null
- 但是,它不会重构如下用法:
String name = myObject.getName(); if (name == null) { ... }
- 也可以对非实例方法使用此操作:
public boolean hasName() { return getName() == null; }
这将导致方法静态化,然后使用重构|转换为实例方法。同样的结果private boolean hasName(MyClass myObject) { return myObject.getName() == null; }
$x$.getName() == null
$x$.hasName()
替换模板:
$x$.getName() == null
$x$.hasName()
单击编辑变量。。。按钮并将表达式类型(regexp)指定为
MyClass
。搜索时,还将找到getObject().getName()==null的示例您可以将getName()
重命名为类似putGuidInheriefYouWantobesure()
的名称,然后在所有文件中使用putGuidInheriefYouWantobesure()==null
替换为hasName()
虽然需要大量手动操作,但为了减少丢失重复代码的可能性,请将注释掉getName()
。然后,您将知道所有需要检查的编译错误。简单的项目范围搜索(查找.getName()==null
)并替换(使用.hasName()
)不起作用吗?@WoodrowBarlow这是目前最好的答案。尽管如此,由于getName
不是唯一的,它将替换太多的错误匹配。我正在寻找一些了解上下文的内容。感谢您的编辑。我不知道可以包含整个页面。我只是手工完成的。这是一个令人头痛的问题,但为了子孙后代的利益,这一点很重要——以防承载信息的服务器变得不可用。您可以通过给出一个使用此技术回答OP特定用例的示例来进一步改进此问题。该方法工作正常,但比查找和替换代码副本更难使用,imho。@Meo您确定吗?您尝试用diff类查找并替换100个方法调用。这是一场噩梦。我喜欢这样做,因为它很容易做到,并且可以在许多IDE中工作,而不仅仅是IntelliJ。但是,此解决方案不会找到与其他解决方案一样多的变体,因为空格、注释等可能会妨碍replac