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

时间:2009-09-15 09:40:42

标签: java eclipse

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

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

我试过了:

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

This answer显示了如何将操作提供给上下文菜单并检索结构化选择。您可以修改该类型的执行方法来处理层次结构(如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;
}

答案 2 :(得分:1)

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

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

恕我直言,这样做的努力就少了,你会得到一个能给你更多的工具。

答案 3 :(得分:0)

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