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

Java 列出具有完全限定名称的所有子类,java,eclipse,Java,Eclipse,我想得到一个给定类的所有子类及其完全限定名的列表。我想将它从Eclipse复制并粘贴到一个文本文件中,如下所示: some.package.Class1 some.package.Class2 some.other.package.Class3 ... 我试过: 执行Search | Java |类型,限制实现者但是出于一些奇怪的原因,这张表没有列出子类的子类,只列出了子类的直接后代 打开打印树组件中所有子类的类的层次结构视图,但是此视图不允许我选择所有行并复制它们的名称 还有别的

我想得到一个给定类的所有子类及其完全限定名的列表。我想将它从Eclipse复制并粘贴到一个文本文件中,如下所示:

 some.package.Class1
 some.package.Class2
 some.other.package.Class3
 ...
我试过:

  • 执行
    Search | Java |类型,限制实现者
    但是出于一些奇怪的原因,这张表没有列出子类的子类,只列出了子类的直接后代
  • 打开打印树组件中所有子类的类的
    层次结构
    视图,但是此视图不允许我选择所有行并复制它们的名称

还有别的把戏吗?有数百个类,因此我希望避免手动执行此操作。

层次结构视图中用于构建层次结构树的方法位于:

哪个使用类

因此,如果您可以得到一个,那么您可以检查这些类以模拟相同的结果

它使用

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

但是,您可以访问nWire数据库,它是一个标准的H2数据库,具有非常简单的结构,并通过简单的查询获得所需的一切。我们将在未来某个时候引入报告功能


恕我直言,这样做不费吹灰之力,你会得到一个能给你带来更多好处的工具。

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

显示如何将操作添加到关联菜单并检索结构化选择。您可以修改该类型的execute方法来处理层次结构(如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;
}

遵循中描述的模式可以通过编程实现。很遗憾Eclipse不能做到这一点。用Java代码进行过滤可以不增加额外的成本(例如,
!(klazz.isEnum())
)。

related@Narayan:我已经看到了这个问题,但这是一个关于以编程方式进行过滤的问题。我希望只需点击几下就可以找到一个解决方案。实际上,你可以得到一个自定义视图,大大降低了“hierarchy view”的
TypeHierarchyViewPart
的复杂性,但使用相同的底层机制来检索/显示类的层次结构。如果你能让Rich的解决方案发挥作用,我建议将他的答案作为这个问题的正式答案,因此您建议在Eclipse中实现自定义视图。我做对了吗?我已经安装了插件。如何“进入NWWire数据库”。我看不到这样的景色。网站对此也没有帮助。或者我应该使用一些数据库客户端来访问它?那么数据库的名称是什么?给我发一封电子邮件到[www.nwiresoftware.com]支持,我会给你发送更多详细信息。
/**
 * @see IType
 */
public ITypeHierarchy newTypeHierarchy(IJavaProject project, IProgressMonitor monitor) throws JavaModelException {
    return newTypeHierarchy(project, DefaultWorkingCopyOwner.PRIMARY, monitor);
}
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;
}