列出具有完全限定名称的所有子类

我想获得一个具有完全限定名称的给定类的所有子类的列表。 我想从Eclipse复制它并粘贴到这样的文本文件中:

some.package.Class1 some.package.Class2 some.other.package.Class3 ... 

我试过了:

  • Search | Java | Type, Limit to implementors Search | Java | Type, Limit to implementors Search | Java | Type, Limit to implementors但是由于一些奇怪的原因,这个没有列出子类的子类,只有直接后代。
  • 打开打印树组件中所有子类的类的Hierarchy视图, 此视图不允许我选择所有行并复制它们的名称。

还有其他技巧吗? 有数百个类,所以我想避免手动操作。

构建层次结构树的Hierarchy视图中的方法位于org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle

 private ITypeHierarchy createTypeHierarchy(IJavaElement element, IProgressMonitor pm) throws JavaModelException { if (element.getElementType() == IJavaElement.TYPE) { IType type= (IType) element; if (fIsSuperTypesOnly) { return type.newSupertypeHierarchy(pm); } else { return type.newTypeHierarchy(pm); } } else { 

其中使用org.eclipse.jdt.internal.core.SourceType类

 /** * @see IType */ public ITypeHierarchy newTypeHierarchy(IJavaProject project, IProgressMonitor monitor) throws JavaModelException { return newTypeHierarchy(project, DefaultWorkingCopyOwner.PRIMARY, monitor); } 

因此,如果您可以获取IJavaElement ,则可以检查这些类以模拟相同的结果。

它使用org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation

更新:我的原始答案不起作用,因为结构化选择没有上下文。

此答案显示如何将操作提供给上下文菜单并检索结构化选择。 您可以修改该类型的执行方法来处理层次结构(如VonC建议的,+ 1)并获取所有子类型并将内容设置为剪贴板,如下所示:

 public Object execute(ExecutionEvent event) throws ExecutionException { IWorkbenchPart activePart = HandlerUtil.getActivePart(event); try { IStructuredSelection selection = SelectionConverter .getStructuredSelection(activePart); IJavaElement[] elements = SelectionConverter.getElements(selection); if (elements != null && elements.length > 0) { if (elements[0] != null && elements[0] instanceof IType) { IType type = (IType)elements[0]; ITypeHierarchy hierarchy = type.newTypeHierarchy(new NullProgressMonitor()); IType[] subTypes = hierarchy.getAllSubtypes(type); StringBuffer buf = new StringBuffer(); for (IType iType : subTypes) { buf.append(iType.getFullyQualifiedName()).append("\n"); } Shell shell = HandlerUtil.getActiveShell(event); Clipboard clipboard = new Clipboard(shell.getDisplay()); clipboard.setContents( new Object[]{buf.toString()}, new Transfer[]{TextTransfer.getInstance()}); } } } catch (JavaModelException e) { logException(e); } return null; } 

nWire for Java可以为您提供扩展给定类或实现特定接口的类的完整列表。 您将在nWire导航器中获取它,它不提供复制命令。

但是,您可以使用nWire数据库,这是一个标准的H2数据库,结构非常简单,只需简单查询即可获得所需的一切。 我们将在未来的某个时间介绍报告function。

恕我直言,这将是一个不那么努力,你会得到一个工具,给你更多。

按照http://internna.blogspot.com/2007/11/java-5-retrieving-all-classes-from.html中描述的模式,可以通过编程方式完成。 遗憾的是Eclipse无法做到OOTB。 在Java代码中执行此操作可以进行过滤而无需额外成本(例如!(klazz.isEnum()) )。