Eclipse 从包中获取包child

Eclipse 从包中获取包child,eclipse,eclipse-jdt,Eclipse,Eclipse Jdt,在Eclipse中,如何获取包的子级 考虑这个例子: + org.stack org.stack.test - StackTest.java - Stack.java 当我们在org.stack中执行IPackageFragment.getChildren()时,EclipseJDT只返回编译单元(Java文件)!但我想要一个包的所有子项:所有ICompilationUnits和所有包 在本例中,当我在org.stack中应用IPackageFragment.g

在Eclipse中,如何获取包的子级

考虑这个例子:

+ org.stack
    org.stack.test
        - StackTest.java
    - Stack.java
当我们在org.stack中执行IPackageFragment.getChildren()时,EclipseJDT只返回编译单元(Java文件)!但我想要一个包的所有子项:所有ICompilationUnits和所有包

在本例中,当我在org.stack中应用IPackageFragment.getChildren()时,我希望org.stack.test和ICompilationUnit stack.java


如何才能做到这一点?

IPackageFragment不是正确的起点。您必须要求更高级别的软件包:

IPackageFragment:单个包。它包含ICompilationUnits或IClassFiles,具体取决于IPackageFragmentRoot是源类型还是二进制类型请注意,IPackageFragment不是作为父级子级组织的。例如,net.sf.a不是net.sf.a.b的母公司。它们是同一IPackageFragmentRoot的两个独立子级。


看看这篇关于

的文章,您需要以递归的方式进行操作

这里有一些伪代码

findAllClasses(package, classesCollection) {
    for(Class c: package.getClasses)
        classesCollection.add(c.getResourcePath)
    if(package.hasChildPackages)
        for(Package p: packages)
            findAllClasses(p, classesCollection)
}

这里的一些代码应该与您所需要的代码非常接近。(因为我们已经过了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();
}
PackageFragment originFragment;//=org.stack的片段
试一试{
String fragmentPath=originFragment.getPath().toString();
IJavaElement父级=originFragment.getParent();
ArrayList所有儿童=
新的ArrayList();
if(IPackageFragmentRoot的父实例){
IPackageFragmentRoot=(IPackageFragmentRoot)父级;
IJavaElement[]rootChildren=root.getChildren();
//原始文件包括原始文件和所有文件包
//它下面的碎片
列出原始片段=
Arrays.asList(rootChildren.stream())
.filter(c->c.getPath().toString().startsWith(fragmentPath))
.collect(Collectors.toList());
allChildren.addAll(原始片段);
//收集包裹碎片的子项
对于(ijavao元素:原始片段){
if(IPackageFragment的o实例){
ragment的IPackageFragment=(IPackageFragment)o;
IJavaElement[]fChildren=oFragment.getChildren();
allChildren.addAll(Arrays.asList(fChildren));
}
}
}
}catch(javamodele异常){
e、 printStackTrace();
}

另一种不雅观的解决方案是从原始片段的路径开始,然后使用Java的文件和目录工具向下遍历目录层次结构。然后,您可以使用
IJavaProject
(IPath路径)
连接到正确的
IPackageFragments

我不想使用AST解析此信息。。。因此,我需要查看所有的iPackageFragmentName,并检查该包是否是其他包的子包,对吗?@zecapistolas:你读过关于IPackageFragmentRoot的引文吗?这个答案使用Java反射,而不是JDT API。