为什么我在JDT API中没有使用getAllSuperclasses()的超类?

时间:2013-01-12 16:01:34

标签: java eclipse eclipse-jdt

我有一个A类,以及在Eclipse工作区中继承A的B类。

enter image description here enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

简答

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

enter image description here

然后,在“Java Build Path”中,您需要添加此jar文件。

enter image description here

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

enter image description here

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

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

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

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

enter image description here

org.eclipse.jdt.internal.core.JavaProjectElementInfo

此类具有缓存初始化方法,例如initializePackageNamesgetProjectCache。在getProjectCache()方法中,将加载包片段元素根并将其添加到缓存中。

enter image description here

使用包片段中的rtstubs.jar,缓存现在包含所有Java类层次结构。如果没有这个设置,在缓存构建过程中,ignoreFurtherInvestigation字段打开,并且hasError()方法返回true,不包含类层次结构信息,只返回任何内容。

enter image description here

ADDED

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

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