Eclipse 从包中获取包child
在Eclipse中,如何获取包的子级 考虑这个例子: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
+ 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。