代码之家  ›  专栏  ›  技术社区  ›  Boris Pavlović

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

  •  7
  • Boris Pavlović  · 技术社区  · 16 年前

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

    8 回复  |  直到 15 年前
        1
  •  10
  •   Boris Pavlović    16 年前

    在Eclipse帮助中找到了这个:

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

    1. 打开搜索对话框并单击 Java搜索选项卡。
    2. 类型“*”和 返回类型,由 搜索字符串中的空格。
    3. 选择 区分大小写复选框。
    4. 选择 方法和声明,然后 单击“搜索”。

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

        2
  •  5
  •   Oege de Moor    16 年前

    感谢您提到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作为父类型的类型。GetAsupType后面有一个星号,因为我们要应用该操作零次或更多次。接下来,我们只选择那些返回类型是这样一个CollectionType并且出现在源代码中的方法。

    继续,尝试一下:-)这是一个简单的练习,可以进一步将查询细化为那些应该返回collectiontype但可能返回空值的方法。所有这些都可以交互完成,在您开发查询时自动完成,并持续检查以帮助您正确地完成查询。您可以以多种不同的方式查看结果,并轻松地在分析结果和代码之间导航。

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

        3
  •  4
  •   nicity    15 年前

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

    class $Class$ { 
      $ReturnType$ $MethodName$($ParameterType$ $Parameter$);
    }
    

    将“返回类型”变量(编辑变量操作)的文本约束设置为java.util.collection,指定“在层次结构中应用约束”以搜索子体。 对于“methodname”变量,指定它是搜索的目标。 开始搜索,享受:)

        4
  •  1
  •   joel.neely    16 年前

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

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

    1. 转到导入java.util.collection的任何类,双击“collection”,右键单击“collection”,然后选择“references>project”。

    2. 同样适用于任何 特定的 利息的收款类型。

    3. 转到返回集合类型的任何方法,双击其返回类型,然后如上所述搜索该类型。

    4. 转到任何导入java.util的类。 任何东西 拖动“java. UTIL”。 省略包前缀后面的类 ,然后右键单击“搜索项目引用”,如上所述。

    对于以上所有内容,“搜索”视图将显示项目中发生所选项目的位置的可展开大纲。您可以遍历该轮廓(使用键盘--按Enter键选择--或鼠标--单击选择)来检查那些使用的位置。我看不到一种方法来限制查看到的对“方法返回类型”的引用,但至少您可以快速移动到代码中的相关位置,以便关注特定的使用类型。

    (对于所有这些,您可以单击“搜索”选项卡顶部的向下小三角形,并筛选要包括在显示中的使用类型,例如排除导入语句。)

        5
  •  1
  •   Scott Stanchfield    16 年前

    插件时间!我做了很多工作…

    抓住

    http://javadude.com/misc/collectionmarker.zip

    http://javadude.com/misc/collectionmarker-source.zip (如果感兴趣)

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

    重新启动Eclipse

    工具栏上有两个小的Eclipse图标-一个清除标记,一个添加标记。

    这个插件搜索工作区中的所有内容;它忽略选择。(很快就脏了)

    希望这有帮助! ——史葛

        6
  •  0
  •   starblue    16 年前

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

        7
  •  0
  •   Chii    16 年前

    Intellij IDEA具有基于结构/表达式的搜索,因此通过搜索返回集合的所有方法,您至少可以获得一些接近的结果。

        8
  •  0
  •   Torsten Marek    16 年前

    PMD 可以检查这个 SemmleCode ,如果您的IDE不支持结构搜索。