您的外掛程式可使用 JDT API 搜尋工作區中的 Java 專案, 以找出 Java 元素, 像是:方法參照、欄位宣告、介面的實作者等。
Java 搜尋的進入點為 SearchEngine 類別。 您可以在 Java 元素內搜尋特殊型樣,並將搜尋範圍限定在特定元素。 您可以使用 createSearchPattern 來建立搜尋型樣。 型樣是使用 createJavaSearchScope 來限定範圍。一旦定義了型樣和範圍,就會使用 search 方法來收集結果。
搜尋結果將報告至 IJavaSearchResultCollector, 因此您必須實作它,才能存取結果。
搜尋作業會使用一個說明搜尋本質的型樣,以及一個用以限制調查範圍的範圍。
搜尋型樣是定義如何尋找搜尋結果。您可以從 Java 元素建立一個搜尋型樣(請參閱 createSearchPattern(IJavaElement, int)), 或從字串建立搜尋型樣(請參閱 createSearchPattern(String, int, int, boolean)。) 後面的方法支援萬用字元(亦即 '*'),並可用來擴大搜尋結果。
舉例來說,下列是說明如何建立一個搜尋型樣,以搜尋給定方法的參照:
// 取得方法 IMethod method = ...; // 建立搜尋型樣 ISearchPattern pattern = SearchEngine.createSearchPattern(method, IJavaSearchConstants.REFERENCES);
下列說明如何建立一個搜尋型樣,以搜尋所有開頭為 "Obj" 之類型的宣告:
// 建立搜尋型樣 ISearchPattern pattern = SearchEngine.createSearchPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, true);
所支援的搜尋型樣如下:
如果您對給定專案或給定套件中的搜尋結果感興趣, 或者如果您知道搜尋結果可侷限在給定類型的階層中, 您可使用 createJavaSearchScope(IJavaElement[]) 或 createHierarchyScope(IType) 建立適當的搜尋範圍。
舉例來說,下列是說明如何建立一個以給定套件為主的搜尋範圍:
// Get the package IPackageFragment pkg = ...; // Create search scope IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});
下列說明如何建立一個以給定類型階層為主的搜尋範圍:
// Get the type IType type = ...; // Create search scope IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);
最後,您可以建立一個以整個工作區為主的搜尋範圍:
// Create search scope IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
一旦您建立搜尋型樣與搜尋範圍,且已實作 IJavaSearchResultCollector, 即可按如下所示啟動搜尋查詢:
// Get the search pattern ISearchPattern pattern = ...; // Get the search scope IJavaSearchScope scope = ...; // Get the search result collector IJavaSearchResultCollector collector = ...; // Search SearchEngine searchEngine = new SearchEngine(); searchEngine.search(ResourcesPlugin.getWorkspace(), pattern, scope, collector);
搜尋所啟動的通知會透過 aboutToStart 方法,傳給您的搜尋結果收集器。接著會使用 accept 方法,報告每一項搜尋結果。最後, done 表示搜尋已結束。
您可利用 accept 方法來報告搜尋結果。下列段落詳述此方法的每一個引數。
搜尋結果可對應至 Java 元素(如:類型宣告), 或者可含在 Java 元素中(例如,方法內之類型的參照)。 搜尋引擎會固定試著尋找對應至(或包含)搜尋結果之最內層的 Java 元素。 舉例來說,如果按名稱搜尋類型宣告時,可找到一個本端類型宣告。 由於 Java 模型不會呈現本端類型,因此會將內含這個本端類型宣告的方法提供給結果收集器。
搜尋引擎亦會試著提供內含 Java 元素的資源給結果收集器。因此,如果 Java 元素是編譯單元中的一個方法, 則資源會是對應的 IFile。 如果元素內含在 .jar 檔中,則資源會是 .jar 檔(如果此 .jar 檔位於工作區中的話)。如果其為外部 .jar 檔,則資源為空值。
原始檔位置會以內含搜尋結果之編譯單元的相對位置提供。 如果搜尋結果內含在 .jar 檔中,則原始檔位置會是所附加之原始檔的相對位置。 如果 .jar 檔沒有附加原始檔,則為 (-1, -1)。
在大部分情況下,搜尋結果皆為精確的, 也就是說,搜尋引擎能夠根據所要求的,確切提供相符項目。 不過,在某些情況下,搜尋引擎無法如此做, 在這類情況中,相符項目並不精確。 造成相符項目不精確的部份可能原因如下: