您的插件可以使用 JDT API 来搜索工作空间中的 Java 项目以找到 Java 元素(例如,方法引用、字段声明和接口的实现器等)。
Java 搜索的入口点是 SearchEngine 类。可以搜索 Java 元素内的特定模式和将搜索范围限定为特定的元素。可以使用 createPattern 来创建搜索模式。使用 createJavaSearchScope 来限定模式的作用域。定义模式和作用域之后,使用 search 方法来收集结果。
将把搜索结果报告给 SearchRequestor,必须扩展它才能访问结果。
搜索操作将使用一种模式来描述搜索性质,并使用作用域来限制搜索范围。
搜索模式定义如何找到搜索结果。可以根据 Java 元素(请参阅 createPatternPattern(IJavaElement, int))或根据字符串(请参阅 createPattern(String, int, int, int))来创建搜索模式。 后一种方法支持通配符(即,“*”),并且可以用来扩大搜索结果。
例如,按如下所示完成创建一种搜索模式来搜索对给定方法的引用:
// Get the method IMethod method = ...; // Create search pattern SearchPattern pattern = SearchPattern.createPattern(method, IJavaSearchConstants.REFERENCES);
或者创建一种搜索模式来搜索以“Obj”开头的所有类型的声明:
// Create search pattern SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);
下列搜索模式是受支持的:
如果您对给定项目甚至是给定包中的搜索结果感兴趣,或者如果您知道搜索结果只能在给定类型的层次结构中,则可以使用 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();
一旦创建了搜索模式和搜索范围,并且扩展了 SearchRequestor,就可以按如下所示开始搜索查询:
// Get the search pattern SearchPattern pattern = ...; // Get the search scope IJavaSearchScope scope = ...; // Get the search requestor SearchRequestor requestor = ...; // Search SearchEngine searchEngine = new SearchEngine(); searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);
使用 beginReporting 方法将搜索开始的通知发送到搜索请求程序中。然后,使用 acceptSearchMatch 方法报告每个搜索结果。最后,endReporting 指示搜索已结束。
将使用 acceptSearchMatch 方法来报告搜索结果。下面的段落详细描述了搜索匹配。
搜索结果可以与 Java 元素(例如,类型声明)相对应,或者它可以包含在 Java 元素(例如,对方法内的类型的引用)中。搜索引擎总是试图找到与搜索结果相对应或者包含搜索结果的最内层 Java 元素。例如,搜索对方法的引用可以在初始化方法中找到这样的引用。包含此方法引用的初始化方法是搜索匹配的元素。
搜索引擎还会试图查找包含 Java 元素的资源。因此,如果 Java 元素是编译单元中的方法,则资源是相应的 IFile。如果元素包含在 .jar 文件中,则资源是该 .jar 文件(如果此 .jar 文件在工作空间中的话)。如果它是外部 .jar 文件,则资源为空。
源位置是相对于包含搜索结果的编译单元来给定的。如果搜索结果包含在 .jar 文件中,则源位置相对于所连接的源。如果没有任何源与 .jar 文件相连,则源位置为(-1, -1)。
在大多数情况下,搜索结果是准确的,这意味着搜索引擎能够确定给定的匹配是否是所请求的内容。但是,在某些情况下,搜索引擎无法做到这一点,在这些情况下,匹配是不准确的。下面是导致匹配不准确的一些可能原因: