簡體   English   中英

如何在項目中搜索返回 Collection 接口實現的所有方法?

[英]How to search for all methods in a project that return implementation of Collection interface?

我一直在閱讀 Josh Bloch 的“有效 Java 第 2 版”。 項目 43 狀態“返回空的 arrays 或 collections,而不是空值”。 我的問題是如何搜索項目中返回 java.util.Collection 接口實現的所有方法? 使用的 IDE 是 Eclipse,但任何找到正確結果的方法都是可以接受的,例如正則表達式或其他一些 IDE。

在 Eclipse 幫助中找到了這個:

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

  1. 打開搜索對話框並單擊 Java 搜索選項卡。
  2. 在搜索字符串中鍵入“*”和返回類型,以空格分隔。
  3. Select 區分大小寫復選框。
  4. Select 方法和聲明,然后單擊搜索。

它可以幫助查找返回特定類型但不返回某些接口的實現的所有方法。

感謝您提及 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 作為超類型的類型。 getASupertype 后面有一顆星,因為我們想應用該操作零次或多次。 接下來我們只是 select 那些返回類型是這樣一個 CollectionType 並且出現在源中的方法。

Go on,試試看:-) 這是一個簡單的練習,可以將查詢進一步細化為那些應該返回 CollectionType 但可能返回 null 的方法。 所有這些都可以交互完成,在您開發查詢時自動完成,並持續檢查以幫助您正確完成。 您可以通過多種不同方式查看結果,並輕松在分析結果和代碼之間導航。

-Oege [披露:我是 Semmle 的首席執行官]

在 IntelliJ IDEA 調用結構搜索中,選擇現有模板“類的方法”。 該操作將添加以下模板:

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

將“ReturnType”變量(編輯變量操作)的文本約束設置為 java.util.Collection,指定“在層次結構內應用約束”以搜索后代。 對於“MethodName”變量,指定它是搜索的目標。 那開始搜索,享受:)

我不知道如何找到返回類型為 java.util.Collection 的任意實現的所有方法(包括您可以自己定義的方法)。

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

  1. Go to any class that imports java.util.Collection, double-click on "Collection", right-click on "Collection", and select "References > Project".

  2. 對於任何特定的感興趣的集合類型也是如此。

  3. Go 到任何返回集合類型的方法,雙擊它的返回類型,然后像上面那樣搜索該類型。

  4. Go 到導入任何 java.util 的任何 class。 任何東西,拖過“java.util”。 在 package 前綴之后省略 class ,然后右鍵單擊搜索上述項目引用。

對於上述所有內容,“搜索”視圖將向您顯示項目中出現所選項目的位置的可展開輪廓。 您可以遍歷該輪廓(使用鍵盤 - 輸入 select - 或鼠標 - 單擊以選擇)以檢查這些使用的位置。 我看不到將查看的引用限制為“方法返回類型”的方法,但至少您可以快速移動到代碼中的相關位置,以關注感興趣的特定使用類型。

(有了所有這些,您可以單擊“搜索”選項卡頂部的小向下三角形並過濾要包含在顯示中的使用類型,例如排除導入語句。)

插件時間。 我做了一個可以完成大部分工作的東西......

抓住

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

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

將 collectionmarker.zip 解壓縮到 eclipse 目錄中(您的 eclipse 目錄應該包含 plugins 目錄)

重啟 eclipse

工具欄上會有兩個小 eclipse 圖標 - 一個清除標記,一個添加它們。

該插件搜索您工作區中的所有內容; 它忽略選擇。 (它又快又臟)

希望這可以幫助! ——斯科特

如果現有的用戶界面沒有辦法做到這一點,您總是可以使用反射來遍歷代碼。 這不是很多工作,幾個嵌套循環。

intellij IDEA 具有基於結構/表達式的搜索,因此通過搜索所有返回 Collection 的方法,您至少可以得到一些接近的結果。

如果您的 IDE 不支持結構搜索, PMD可以檢查這一點, SemmleCode也可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM