使用搜索引擎在Java / eclipse中实现调用层次结构(获取调用某个方法的所有方法)

我有一个名为“javaProject”的Java项目,它有两个Hello和ReferenceHello类。

在此处输入图像描述

Hello.java

package com.prosseek.test; public class Hello { public void world() { System.out.println("Hello world"); } public void referWorld() { world(); } } 

ReferenceHello.java

 package com.prosseek.test; public class ReferenceHello { public void referWorld() { Hello h = new Hello(); h.world(); } } 

我可以使用Search / Java对话框找到引用(或调用)Hello.world()的所有方法。

在此处输入图像描述

我想使用Search Engine编程方式获得相同的结果。 这是我想出的代码,但它什么也没有返回。

 public void testIt() throws CoreException { String projectName = "javaProject"; IJavaProject javaProject = JavaProjectHelper.createJavaProject(projectName); String targetMethodName = "world"; SearchPattern pattern = SearchPattern.createPattern( targetMethodName, IJavaSearchConstants.METHOD, IJavaSearchConstants.REFERENCES, SearchPattern.R_CASE_SENSITIVE // <--- ???? ); boolean includeReferencedProjects = false; IJavaElement[] javaProjects = new IJavaElement[] {javaProject}; IJavaSearchScope scope = SearchEngine.createJavaSearchScope(javaProjects, includeReferencedProjects); // <--- ???? SearchRequestor requestor = new SearchRequestor() { @Override public void acceptSearchMatch(SearchMatch match) throws CoreException { System.out.println(match.getElement()); } }; SearchEngine searchEngine = new SearchEngine(); searchEngine.search( pattern, new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null); } 
  • 我的搜索代码可能有什么问题?
  • 是否有其他方法可以通过编程方式在eclipse插件中获取调用层次结构?

添加

搜索代码工作正常,问题在于我错误地使用了JavaProjectHelper.createJavaProject 。 我应该打开现有的java项目,而不是创建一个具有相同名称的项目。 结果,.metadata被破坏,没有搜索到任何内容。

使用我的新getJavaProject方法,现在一切正常。

 private IJavaProject getJavaProject(String projectName) throws CoreException { IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot(); IProject project= root.getProject(projectName); if (!project.exists()) { project.create(null); } else { project.refreshLocal(IResource.DEPTH_INFINITE, null); } if (!project.isOpen()) { project.open(null); } IJavaProject jproject= JavaCore.create(project); return jproject; } 

从这个网站的暗示。 我可以使用CallHierarchy API。

getCallersOf()方法

 package com.prosseek.asttest; // http://www.programcreek.com/2011/07/find-all-callers-of-a-method/ import java.util.HashSet; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.internal.corext.callhierarchy.CallHierarchy; import org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper; public class CallHierarchyGenerator { public HashSet getCallersOf(IMethod m) { CallHierarchy callHierarchy = CallHierarchy.getDefault(); IMember[] members = { m }; MethodWrapper[] methodWrappers = callHierarchy.getCallerRoots(members); HashSet callers = new HashSet(); for (MethodWrapper mw : methodWrappers) { MethodWrapper[] mw2 = mw.getCalls(new NullProgressMonitor()); HashSet temp = getIMethods(mw2); callers.addAll(temp); } return callers; } HashSet getIMethods(MethodWrapper[] methodWrappers) { HashSet c = new HashSet(); for (MethodWrapper m : methodWrappers) { IMethod im = getIMethodFromMethodWrapper(m); if (im != null) { c.add(im); } } return c; } IMethod getIMethodFromMethodWrapper(MethodWrapper m) { try { IMember im = m.getMember(); if (im.getElementType() == IJavaElement.METHOD) { return (IMethod) m.getMember(); } } catch (Exception e) { e.printStackTrace(); } return null; } } 

findMethod实用程序

 IMethod findMethod(IType type, String methodName) throws JavaModelException { //IType type = project.findType(typeName); IMethod[] methods = type.getMethods(); IMethod theMethod = null; for (int i = 0; i < methods.length; i++) { IMethod imethod = methods[i]; if (imethod.getElementName().equals(methodName)) { theMethod = imethod; } } if (theMethod == null) { System.out.println("Error, method" + methodName + " not found"); return null; } return theMethod; } 

用法

  CallHierarchyGenerator callGen = new CallHierarchyGenerator(); IMethod m = findMethod(type, "world"); Set methods = new HashSet(); methods = callGen.getCallersOf(m); for (Iterator i = methods.iterator(); i.hasNext();) { System.out.println(i.next().toString()); } 

结果

 void referWorld() {key=Lcom/prosseek/test/ReferenceHello;.referWorld()V} [in ReferenceHello [in ReferenceHello.java [in com.prosseek.test [in src [in javaTest]]]]] void referWorld() {key=Lcom/prosseek/test/Hello;.referWorld()V} [in Hello [in Hello.java [in com.prosseek.test [in src [in javaTest]]]]] 

在创建搜索范围的方法中设置断点,并在调试模式下启动运行时工作台。 当你在那里调用Call Hierarchy时,它应该停止并让你看到它是如何完成的。