我有一个A类,以及在Eclipse工作区中继承A的B类。
我遇到的问题是,当我尝试使用eclipse JDT API获取超类型B时,我什么都没得到。这是代码(我从 - List all subclasses with fully qualified names得到了代码):
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
java.io.File workspaceDirectory = root.getLocation().toFile();
// 1. The name of the project in the workspace
IProgressMonitor pm = new NullProgressMonitor();
IProject orig = root.getProject(this.projectName);
orig.open(pm);
this.javaProject = JavaCore.create(orig);
orig.refreshLocal(IResource.DEPTH_INFINITE, pm);
// 2. Find the type
IType type = this.javaProject.findType("p.B"); <-- returns correct type info
ITypeHierarchy hier = type.newSupertypeHierarchy(new NullProgressMonitor());
IType[] types = hier.getAllSuperclasses(type);
System.out.println(types); <-- Returns []
我还添加了代码来刷新/更新包中的资源。
IPackageFragmentRoot[] packageFragmentRoots = this.javaProject.getPackageFragmentRoots();
for (IPackageFragmentRoot proot: packageFragmentRoots)
{
proot.getResource().refreshLocal(IResource.DEPTH_INFINITE, null);
}
除了获取分层类型信息外,一切正常。 可能有什么问题?在执行API之前我没有错过任何设置吗?
我的是无头RCP应用程序。
答案 0 :(得分:1)
这可能是一个临时解决方案,但它对我有用。
创建一个lib目录,并将此rtstubs.jar复制到该目录中。 您可能需要刷新(F5)eclipse IDE以查看jar文件是否包含在项目中。
然后,在“Java Build Path”中,您需要添加此jar文件。
在包片段中包含jar文件后,您将获得类层次结构。
它有一个字段ignoreFurtherInvestigation
,方法hasErrors()
返回此字段。
org.eclipse.jdt.internal.core.hierarchy.HierarchyResolver #resfolution()方法调用hasError()将类型信息添加到缓存中。但是,如果不包含jar文件,hasError()方法始终返回false以防止存储任何类层次结构信息。
此类具有缓存初始化方法,例如initializePackageNames
和getProjectCache
。在getProjectCache()
方法中,将加载包片段元素根并将其添加到缓存中。
使用包片段中的rtstubs.jar,缓存现在包含所有Java类层次结构。如果没有这个设置,在缓存构建过程中,ignoreFurtherInvestigation字段打开,并且hasError()方法返回true,不包含类层次结构信息,只返回任何内容。
另一种解决方案可以使用IRegion。
How can I set the region (=set of java Elements) parameter in JDT TypeHierarchy?