代码之家  ›  专栏  ›  技术社区  ›  Grzegorz Oledzki

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

  •  5
  • Grzegorz Oledzki  · 技术社区  · 15 年前

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

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

    我试过了:

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

    还有别的把戏吗?有数百个类,所以我想避免手工操作。

    4 回复  |  直到 8 年前
        1
  •  3
  •   VonC    15 年前

    层次结构视图中用于构建层次结构树的方法位于 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

        2
  •  3
  •   Community CDub    7 年前

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

    This answer 显示如何将操作贡献到上下文菜单并检索结构化选择。您可以修改该类型的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;
    }
    
        3
  •  1
  •   zvikico    15 年前

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

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

    嗯,这不会太费劲,你会得到一个能给你更多的工具。

        4
  •  0
  •   andref    8 年前

    遵循中描述的模式 http://internna.blogspot.com/2007/11/java-5-retrieving-all-classes-from.html 你可以通过程序来实现。很遗憾Eclipse做不到。在Java代码中执行它可以在没有额外成本的情况下进行过滤(例如)。 !(klazz.isEnum()) )