Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何跨文件提取方法?_Java_Intellij Idea_Refactoring_Structural Search - Fatal编程技术网

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

在项目的所有java文件中,我希望替换以下内容:

myObject.getName() == null
因此:

myObject.hasName()
IntelliJ IDEA是否有任何行动或策略可以做到这一点

  • 我希望它对我的类
    MyClass
    getName
    方法是特定的,而不是替换代码,它引用了其他类的
    getName
    方法
  • 我希望它能找到尽可能多的匹配项。它不应该关心其他空格、换行符等。如果变量有其他名称(如
    myObj
    objX
    ),则也应该起作用。还应该找到像
    getObject().getName()
    这样的调用。(搜索必须关注语义)
  • 我希望它是快速的,而不是要求我一个接一个地进行数百场比赛
来自


替换指定路径内所有文件中的一段文本
  • 执行以下操作之一:
    • 在主菜单上,选择编辑|查找|替换路径
    • 按Ctrl+Shift+R组合键
    • 在“在路径中查找”对话框中,按Ctrl+Shift+R切换到“在路径中替换”对话框
  • 在路径中替换对话框中,指定搜索和替换字符串、搜索选项和范围。显式键入搜索和替换文本,或使用正则表达式指定模式,或从“最近历史记录”下拉列表中选择以前使用的文本或模式。
    • 如果通过正则表达式指定搜索和/或替换文本,请在反向引用中使用
      $n
      格式(以引用以前找到并保存的模式)
    • 若要在正则表达式中使用反斜杠字符
      \
      ,请通过在介词
      \\\\\
      中插入三个额外的反斜杠来转义有意义的反斜杠
  • 在查找窗口中单击替换。IntelliJ IDEA在中显示搜索字符串遇到的实例,选择第一个实例,在编辑器中打开包含此实例的文件,并将焦点移到该文件。
    同时,IntelliJ IDEA打开“替换用法”对话框,标题栏中显示了所遇到事件的完整路径: 执行以下操作之一:
    • 要替换选定的引用,请单击“替换”
    • 要保留所选事件并移动到下一个事件,请单击“跳过”
    • 要替换当前活动选项卡中出现的所有搜索字符串,请单击此文件中的全部替换
    • 要保留当前活动选项卡(任意)中出现的搜索字符串并移动到下一个文件,请单击“跳到下一个文件”
    • 要替换所有检测到的事件,请单击所有文件
    • 要切换到手动模式,请单击预览。替换用法对话框关闭,焦点移动到查找工具窗口。执行以下操作之一:
      • 浏览检测到的事件列表,选择要替换的事件,然后单击替换所选事件
      • 要更改所有引用,请单击“全部替换”
  • 使用

  • 创建实例方法:

    public boolean hasName() {
        return getName() == null;
    }
    
    private boolean hasName(MyClass myObject) {
        return myObject.getName() == null;
    }
    
    • 为此,我建议选择
      myObject.getName()==null
      ,然后使用操作Refactor | Extract | Method…Refactor | Move…,这样就不必键入任何代码
  • 单击该方法并使用重构|查找并替换重复的代码

    • 但是,它不会重构如下用法:

      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