4

我在 Eclipse 工作区中有 A 类和继承 A 的 B 类。

在此处输入图像描述 在此处输入图像描述

我遇到的问题是,当我尝试使用 eclipse JDT API 获取 B 类的超级类型时,我什么也没得到。这是代码(我从 - List all subclasses with fullqualified 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 应用程序。

4

1 回答 1

1

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

简答

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

CompilationUnitDeclaration (org.eclipse.jdt.internal.compiler.ast) 和层次结构解析器 (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。

如何在 JDT TypeHierarchy 中设置区域(= java 元素集)参数?

于 2013-01-15T01:30:20.003 回答