我有A类,并且B类在Eclipse工作区中继承了A。


我遇到的问题是,当我尝试使用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应用程序。

最佳答案

这可能是一个临时解决方案,但对我有用。

简短答案

创建一个lib目录,然后将此rtstubs.jar复制到该目录中。
您可能需要刷新(F5)Eclipse IDE,以查看jar文件包含在项目中。

然后,在“Java构建路径”中,您需要添加此jar文件。

将jar文件包含在包片段中之后,您将获得类层次结构。

长答案(为什么这可以解决问题)

CompilationUnitDeclaration(org.eclipse.jdt.internal.compiler.ast)和Hierarchy Resolver(org.eclipse.jdt.internal.core.hierarchy)

它具有字段ignoreFurtherInvestigation,方法hasErrors()返回此字段。

org.eclipse.jdt.internal.core.hierarchy.HierarchyResolver#resolve()方法调用hasError()将类型信息添加到缓存中。但是,在不包含jar文件的情况下,hasError()方法始终返回false,以防止存储任何类层次结构信息。

org.eclipse.jdt.internal.core.JavaProjectElementInfo

此类具有诸如initializePackageNamesgetProjectCache的缓存初始化方法。在getProjectCache()方法中,程序包片段元素的根被加载并添加到缓存中。

在包片段中包含rtstubs.jar时,缓存现在包含所有Java类层次结构。如果不进行此设置,则在缓存建立过程中,ignoreFurtherInvestigation字段处于打开状态,并且hasError()方法返回true,不包含类层次结构信息,仅返回任何内容。

添加

另一个解决方案可以使用IRegion。

How can I set the region (=set of java Elements) parameter in JDT TypeHierarchy?

09-08 06:56