[英]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 幫助中找到了這個:
要搜索具有特定返回類型的方法,請使用“*”,如下所示:
它可以幫助查找返回特定類型但不返回某些接口的實現的所有方法。
感謝您提及 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 的任意實現的所有方法(包括您可以自己定義的方法)。
如果您可以接受更有限的解決方案,那么會想到一些可能性:
Go to any class that imports java.util.Collection, double-click on "Collection", right-click on "Collection", and select "References > Project".
對於任何特定的感興趣的集合類型也是如此。
Go 到任何返回集合類型的方法,雙擊它的返回類型,然后像上面那樣搜索該類型。
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.