Java 如何搜索项目中返回集合接口实现的所有方法?

Java 如何搜索项目中返回集合接口实现的所有方法?,java,regex,search,methods,return-type,Java,Regex,Search,Methods,Return Type,我一直在读Josh Bloch的《有效Java第二版》。第43项声明“返回空数组或集合,而不是null”。我的问题是如何搜索项目中返回java.util.Collection接口实现的所有方法?使用的IDE是Eclipse,但任何找到正确结果的方法都是可以接受的,例如regex或其他IDE。如果现有用户界面无法做到这一点,则始终可以使用反射来遍历代码。这不需要太多的工作,只需要几个嵌套循环。intellij IDEA有基于结构/表达式的搜索,因此通过搜索返回集合的所有方法,您至少可以找到接近的结

我一直在读Josh Bloch的《有效Java第二版》。第43项声明“返回空数组或集合,而不是null”。我的问题是如何搜索项目中返回java.util.Collection接口实现的所有方法?使用的IDE是Eclipse,但任何找到正确结果的方法都是可以接受的,例如regex或其他IDE。

如果现有用户界面无法做到这一点,则始终可以使用反射来遍历代码。这不需要太多的工作,只需要几个嵌套循环。

intellij IDEA有基于结构/表达式的搜索,因此通过搜索返回集合的所有方法,您至少可以找到接近的结果。

我不知道如何找到返回类型为java.util.Collection任意实现的所有方法(包括你自己定义的那些)

如果您可以接受更有限的解决方案,那么您会想到以下几种可能性:

  • 转到导入java.util.Collection的任何类,双击“Collection”,右键单击“Collection”,然后选择“References>Project”

  • 同样,对于任何特定的收款类型的利息

  • 转到任何返回集合类型的方法,双击其返回类型,并如上所述搜索该类型

  • 转到导入任何java.util.anything的任何类,在“java.util”上拖动。忽略该包前缀后面的类,然后右键单击上面的搜索项目引用

  • 对于以上所有内容,“搜索”视图将向您显示项目中出现所选项目的位置的可扩展轮廓。您可以遍历该轮廓(使用键盘--使用enter键选择--或使用鼠标--单击选择)来检查这些使用的位置。我看不到将查看的引用限制为“方法返回类型”,但至少您能够快速移动到代码中的相关位置,以查看感兴趣的特定使用类型


    (有了所有这些,你可以点击“搜索”选项卡顶部的小向下三角形,并过滤要包含在显示中的使用类型,例如排除导入语句。)

    插件时间!我做了一些事情,完成了大部分工作

    抓住

    (如有兴趣)

    将collectionmarker.zip解压到eclipse目录中(eclipse目录应该包含一个插件目录)

    重新启动eclipse

    工具栏上会有两个小eclipse图标——一个清除标记,一个添加标记

    这个插件会搜索你工作区中的所有内容;它会忽略所做的选择

    希望这有帮助!
    --Scott在Eclipse帮助中找到了以下内容:

    要搜索具有特定返回类型的方法,请使用“*”,如下所示:

  • 打开“搜索”对话框并单击 Java搜索选项卡
  • 键入“*”和 返回类型,由 搜索字符串中的空格
  • 挑选 选中区分大小写复选框
  • 挑选 方法和声明,然后 单击搜索

  • 它可以帮助查找所有返回特定类型的方法,但不返回某些接口的实现。

    如果您的IDE不支持结构化搜索,也可以进行检查。

    感谢您提到SemmleCode。要查找源代码中返回java.util.Collection子类型的所有方法,请编写:

    import default
    
    class CollectionType extends RefType {
      CollectionType() {
        this.getASupertype*().hasQualifiedName("java.util","Collection")
      }
    }
    
    from Method m
    where m.getType() instanceof CollectionType
          and
          m.fromSource()
    select m
    
    也就是说,我们首先定义CollectionType的含义:将java.util.Collection作为超类型的所有类型。GetAsPerType后面有一个星形,因为我们希望将该操作应用零次或多次。接下来,我们只选择返回类型为CollectionType且发生在源代码中的方法

    继续,试试看:-)将查询进一步细化为那些本应返回CollectionType但可能返回null的方法是一个简单的练习。所有这些都可以通过交互方式完成,在开发查询时自动完成,并通过连续检查帮助您正确执行查询。您可以以多种不同的方式查看结果,并在分析和查询之间导航结果和代码都很容易

    -奥奇
    [披露:我是Semmle的首席执行官]

    在IntelliJ IDEA调用结构搜索中,选择现有模板“类的方法”。 该操作将添加以下模板:

    class $Class$ { $ReturnType$ $MethodName$($ParameterType$ $Parameter$); } 类$class${ $ReturnType$$MethodName$($ParameterType$$Parameter$); } 将“ReturnType”变量(编辑变量操作)的文本约束设置为java.util.Collection,指定“在层次结构中应用约束”以搜索子体。 对于“MethodName”变量,指定它是搜索的目标。
    开始搜索,享受:)

    看不到这两个小小的eclipse图标…你有什么教程吗?发电子邮件给我scott@javadude.com要讨论此IntelliJ有一个警告/错误,您可以打开已为集合/映射类型返回null的查找位置(如果为数组返回null,则另一个)这将使此搜索变得多余。;)您可以添加@NotNull注释来检测值何时可以为null,但不允许为null。