从包中获取包子

时间:2011-11-28 11:46:18

标签: eclipse eclipse-jdt

在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 ...

我该怎么做?

3 个答案:

答案 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)
}