【发布时间】:2014-03-28 16:12:46
【问题描述】:
如标题所述,我确实没有知道包名称或信息。我有一个 IProject 句柄和一个代表 IFile 名称的字符串。
IFile 是一个.java 类文件,而IProject 是一个Java 项目。理想情况下,我想在不假设它们是 Java 文件/项目的情况下这样做——但对于我的目的来说,假设是可以的。有什么建议吗?
【问题讨论】:
标签: java eclipse api eclipse-plugin eclipse-api
如标题所述,我确实没有知道包名称或信息。我有一个 IProject 句柄和一个代表 IFile 名称的字符串。
IFile 是一个.java 类文件,而IProject 是一个Java 项目。理想情况下,我想在不假设它们是 Java 文件/项目的情况下这样做——但对于我的目的来说,假设是可以的。有什么建议吗?
【问题讨论】:
标签: java eclipse api eclipse-plugin eclipse-api
如果你想递归地从 IProject 获取文件,你可以使用 IProject#members。
public IFile findFileRecursively(IContainer container, String name) throws CoreException {
for (IResource r : container.members()) {
if (r instanceof IContainer) {
IFile file = findFileRecursively((IContainer) r, name);
if(file != null) {
return file;
}
} else if (r instanceof IFile && r.getName().equals(name)) {
return (IFile) r;
}
}
return null;
}
可以如下调用该方法。
IFile file = findFileRecursively(project, "Foo.java");
如果要不递归查找文件,可以使用IProject#findMembers(String)。
【讨论】:
如果你要坚持使用资源,你应该使用IResource#accept(IResourceProxyVisitor)——这是浏览资源树的最轻量级的方式。您的访问者将能够为项目中的每个资源询问给定的 IResourceProxy 实例其类型和名称,然后在它与代理上的匹配项既是文件又具有正确名称时请求完整路径。
如果你愿意通过 JDT API,它的SearchEngine 就是为这种事情而构建的,它有专门查找类型名称的方法。在实现类中设置一些断点并尝试从运行时工作台的 UI 中执行一些 Java 搜索,以更好地了解它的设置方式。
【讨论】: