Перечислите все подклассы с полностью определенными именами - PullRequest
5 голосов
/ 15 сентября 2009

Я хотел бы получить список всех подклассов данного класса с их полностью определенными именами. Я хотел скопировать его из Eclipse и вставить в текстовый файл, например так:

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

Я пробовал:

  • делает Search | Java | Type, Limit to implementors. Но этот по каким-то странным причинам не перечисляет подклассы подклассов, только прямые потомки.
  • открытие Hierarchy представления для класса, который печатает все подклассы в компоненте дерева, , но это представление не позволяет мне выбрать все строки и скопировать их имена.

Есть еще какие-нибудь хитрости? Есть сотни классов, поэтому я хотел не делать это вручную.

Ответы [ 4 ]

3 голосов
/ 15 сентября 2009

Обновление: мой оригинальный ответ не сработает, поскольку нет контекста для структурированного выделения.

В этом ответе показано, как добавить действие в контекстное меню и получить структурированный выбор. Вы можете изменить метод 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 голосов
/ 15 сентября 2009

Метод в представлении Иерархия, который строит дерево иерархии, находится в 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 class

/**
 * @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 голос
/ 15 сентября 2009

nWire for Java может предоставить вам полный список классов, которые расширяют данный класс или реализуют определенный интерфейс. Вы получите его в навигаторе nWire, который не предоставляет команду копирования.

Однако вы можете подключиться к базе данных nWire, которая является стандартной базой данных H2 и имеет очень простую структуру, и получить все необходимое с помощью простого запроса. Мы будем внедрять функции отчетности в будущем.

ИМХО, это будет меньше усилий, и вы получите инструмент, который даст вам гораздо больше.

0 голосов
/ 16 сентября 2009

Следуя шаблону, описанному в http://internna.blogspot.com/2007/11/java-5-retrieving-all-classes-from.html, это можно сделать программно. Обидно, что Затмение не может сделать это OOTB. Выполнение этого в коде Java позволяет выполнять фильтрацию без дополнительных затрат (например, !(klazz.isEnum())).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...