我有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
此类具有诸如initializePackageNames
和getProjectCache
的缓存初始化方法。在getProjectCache()
方法中,程序包片段元素的根被加载并添加到缓存中。
在包片段中包含rtstubs.jar时,缓存现在包含所有Java类层次结构。如果不进行此设置,则在缓存建立过程中,ignoreFurtherInvestigation字段处于打开状态,并且hasError()方法返回true,不包含类层次结构信息,仅返回任何内容。
添加
另一个解决方案可以使用IRegion。
How can I set the region (=set of java Elements) parameter in JDT TypeHierarchy?