2009-09-15 10 views
5

Je voudrais obtenir une liste de toutes les sous-classes d'une classe donnée avec leurs noms complets. Je voulais le copier Eclipse et coller dans un fichier texte comme celui-ci:Liste toutes les sous-classes avec des noms entièrement qualifiés

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

J'ai essayé:

  • faire Search | Java | Type, Limit to implementors. Mais celui-ci pour des raisons étranges ne liste pas les sous-classes de sous-classes, seulement les descendants directs.
  • ouverture Hierarchy vue pour la classe qui imprime toutes les sous-classes dans un composant arbre, mais cette vue ne me permet pas de sélectionner toutes les lignes et de copier leurs noms.

D'autres astuces? Il y a des centaines de classes, donc je voulais éviter de le faire manuellement.

+0

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

+1

@Narayan: J'ai vu la question, mais celui-ci est de le faire par programme. J'espérais une solution en quelques clics. –

+0

Vous pourriez obtenir une vue personnalisée en effet, beaucoup moins compliqué que le 'TypeHierarchyViewPart' de la" vue hiérarchique ", mais en utilisant le même mécanisme sous-jacent pour récupérer/afficher la hiérarchie des classes. – VonC

Répondre

3

La méthode dans la vue hiérarchique qui ne construit l'arborescence est dans le 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 { 

qui utilise org.eclipse.jdt.internal.core.SourceType classe

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

Donc, si vous pouvez obtenir un IJavaElement, vous pouvez vérifier ces classes pour émuler le même résultat.

Il utilise un org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation

+0

Vous proposez donc d'implémenter une vue personnalisée dans Eclipse. Est-ce que je comprends bien? –

1

nWire for Java peut vous donner la liste complète des classes qui étendent une classe donnée ou implémentent une interface spécifique. Vous l'obtiendrez dans le navigateur nWire, qui ne fournit pas de commande de copie. Cependant, vous pouvez accéder à la base de données nWire, qui est une base de données H2 standard et dont la structure est très simple, et obtenir tout ce dont vous avez besoin avec une requête simple. Nous mettrons en place des capacités de reporting dans le futur.

À mon humble avis, ce sera moins un effort et vous obtiendrez un outil qui vous donne beaucoup plus.

+0

J'ai installé le plugin. Comment puis-je "puiser dans la base de données nWire". Je ne vois aucune vue comme celle-ci. Le site ne l'aide pas non plus. Ou devrais-je utiliser un client de base de données pour y accéder? Quel est le nom de la base de données alors? –

+0

Envoyez-moi un email pour soutenir [at] nwiresoftware.com et je vous enverrai plus de détails. – zvikico

3

Mise à jour: ma réponse originale ne fonctionnerait pas car il n'y a pas de contexte à la sélection structurée.

This answer montre comment contribuer l'action au menu contextuel et récupérer la sélection structurée. Vous pouvez modifier exécuter la méthode de ce type pour traiter la Hiérarchie (comme VonC suggère, +1) et d'obtenir tous les sous-types et définir le contenu du presse-papiers comme suit:

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

Laissez-moi voir ... génial? +1 (diable +10 si je le pouvais). – VonC

+0

:) merci beaucoup –

Questions connexes