在Eclipse中如何获取包的子包?
考虑这个例子:
+ org.stack
org.stack.test
- StackTest.java
- Stack.java
当我们在 org.stack 中执行IPackageFragment.getChildren()时,Eclipse JDT只返回编译单元(Java Files)!但我想要一个包的所有子节点:所有ICompilationUnits和所有包。
在本例中,当我在 org.stack 中应用IPackageFragment.getChildren()时,我想要 org.stack.test 和ICompilationUnit Stack.java ...
我该怎么做?
答案 0 :(得分:2)
IPackageFragment不是正确的起点。你必须要求更高级别的包裹:
IPackageFragment:单个包。它包含ICompilationUnits或IClassFiles,具体取决于IPackageFragmentRoot是source类型还是binary类型。 请注意,IPackageFragment未被组织为父子。例如。 net.sf.a不是net.sf.a.b的父级。他们是同一IPackageFragmentRoot的两个独立子项。
查看有关AST
的这篇文章答案 1 :(得分:0)
有些代码应该与您需要的代码接近。 (由于我们已经过了2011年,所以我怀疑它会对您有很大帮助,但也许会对其他人有所帮助。)毫无疑问,它可以取得一些进步。
由于似乎不可能直接从IPackageFragment
向下递归(正如Kai所提到的那样),因此基本思想是获取更高级别的IPackageFragmentRoot
并根据原始内容过滤其子级片段的路径。
PackageFragment originFragment; // = org.stack's fragment
try {
String fragmentPath = originFragment.getPath().toString();
IJavaElement parent = originFragment.getParent();
ArrayList<IJavaElement> allChildren =
new ArrayList<IJavaElement>();
if (parent instanceof IPackageFragmentRoot) {
IPackageFragmentRoot root = (IPackageFragmentRoot)parent;
IJavaElement[] rootChildren = root.getChildren();
// originsFragments includes the origin and all package
// fragments beneath it
List<IJavaElement> originsFragments =
Arrays.asList(rootChildren).stream()
.filter(c -> c.getPath().toString().startsWith(fragmentPath))
.collect(Collectors.toList());
allChildren.addAll(originsFragments);
// Gather the children of the package fragments
for (IJavaElement o : originsFragments) {
if (o instanceof IPackageFragment ) {
IPackageFragment oFragment = (IPackageFragment)o;
IJavaElement[] fChildren = oFragment.getChildren();
allChildren.addAll(Arrays.asList(fChildren));
}
}
}
} catch (JavaModelException e) {
e.printStackTrace();
}
一个替代的优雅解决方案是从原始片段的路径开始,然后使用Java的文件和目录功能来遍历目录层次结构。然后,您可以使用IJavaProject
的{{3}} (IPath path)
连接到正确的IPackageFragments
。
答案 2 :(得分:-1)
您需要以递归方式执行此操作。
这里有一些伪代码
findAllClasses(package, classesCollection) {
for(Class c: package.getClasses)
classesCollection.add(c.getResourcePath)
if(package.hasChildPackages)
for(Package p: packages)
findAllClasses(p, classesCollection)
}