2009-09-15 50 views
5

Me gustaría obtener una lista de todas las subclases de una clase determinada con sus nombres completos. Quería copiarlo de Eclipse y pegar en un archivo de texto como este:Listar todas las subclases con nombres completos

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

He intentado:

  • haciendo Search | Java | Type, Limit to implementors. Pero este por razones extrañas no enumera las subclases de las subclases, solo los descendientes directos.
  • apertura Hierarchy vista para la clase que imprime todas las subclases en un componente de árbol, pero esta vista no me permite seleccionar todas las filas y copiar sus nombres.

¿Algún otro truco? Hay cientos de clases, así que quería evitar hacerlo manualmente.

+0

relacionado http://stackoverflow.com/questions/492184/how-do-you-find-all-subclasses-of-a-given-class-in-java – Narayan

+1

@Narayan: He visto la pregunta, pero esa se trata de hacerlo programáticamente. Esperaba una solución con unos pocos clics. –

+0

Podría obtener una vista personalizada, mucho menos complicada que la 'TypeHierarchyViewPart' de la" vista de jerarquía ", pero utilizando el mismo mecanismo subyacente para recuperar/mostrar la jerarquía de clases. – VonC

Respuesta

3

El método en la vista de estructura jerárquica, que hace construir el árbol de jerarquía está en el 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 { 

que utiliza org.eclipse.jdt.internal.core.SourceType clase

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

Así que si usted puede conseguir un IJavaElement, se puede comprobar esas clases para emular el mismo resultado.

Se utiliza un org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation

+0

Así que sugiere implementar una vista personalizada en Eclipse. ¿Lo entiendo bien? –

1

nWire for Java le puede dar la lista completa de las clases que se extienden a una determinada clase o que implementan una interfaz específica. Lo obtendrá en el navegador nWire, que no proporciona un comando de copia.

Sin embargo, puede acceder a la base de datos nWire, que es una base de datos H2 estándar y tiene una estructura muy simple, y obtiene todo lo que necesita con una simple consulta. Vamos a presentar capacidades de informes en algún momento en el futuro.

En mi humilde opinión, será un esfuerzo menor y obtendrá una herramienta que le ofrece mucho más.

+0

He instalado el complemento. ¿Cómo puedo "acceder a la base de datos de nWire"? No veo ninguna vista como esta. Tampoco el sitio web ayuda al respecto. ¿O debería usar algún cliente de base de datos para acceder a él? ¿Cuál es el nombre de la base de datos entonces? –

+0

Envíame un correo electrónico a support [at] nwiresoftware.com y te enviaré más detalles. – zvikico

3

Actualización: mi respuesta original no funcionaría ya que no hay contexto para la selección estructurada.

This answer muestra cómo contribuir con la acción al menú contextual y recuperar la selección estructurada. Puede modificar método de ejecución de ese tipo para procesar la Jerarquía (como sugiere VonC, 1) y obtener todos los subtipos y establecer el contenido en el portapapeles como sigue:

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; 
} 
+0

Déjame ver ... ¿impresionante? +1 (diablos +10 si pudiera). – VonC

+0

:) muchas gracias –

Cuestiones relacionadas