2010-07-17 15 views
7

am scrivendo un plug-in Eclipse e stavo cercando di creare un metodo che restituisca tutte le classi nello spazio di lavoro in ArrayList < \ Class < \? >> (Ho aggiunto il " \ "per includere le parentesi generiche dato che html non me lo consentirà altrimenti).Come ottenere tutte le classi dallo spazio di lavoro corrente in Eclipse

Ecco il codice che ho:

private ArrayList<Class<?>> getAllClasses() throws JavaModelException { 

ArrayList<Class<?>> classList = new ArrayList<Class<?>>(); 

IWorkspace workspace = ResourcesPlugin.getWorkspace(); 
IWorkspaceRoot root = workspace.getRoot(); 
IProject[] projects = root.getProjects(); 

for (IProject project : projects) { 
    IJavaProject javaProject = JavaCore.create(project); 
    IPackageFragment[] packages = javaProject.getPackageFragments(); 

    for (IPackageFragment myPackage : packages) { 
    IClassFile[] classes = myPackage.getClassFiles(); 

    for (IClassFile myClass : classes) { 
    classList.add(myClass.getClass()); 
    } 
    } 
} 

    return classList; 
} 

Questo, tuttavia, non sembra funzionare. Avevo alcune linee di stampa, e ho capito che include anche classi irrilevanti (per esempio classi da Java \ jre6 \ lib \ rt.jar). Eventuali suggerimenti?

+0

si prega di fare riferimento al http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_int_model.htm Qui è possibile trovare un buona descrizione del modello JDT. – GeT

risposta

0

Forse è possibile utilizzare IJavaProject.getAllPackageFragmentRoots() per ottenere tutte cartella di origine, e quindi ottenere ICompilationUnits in esso.

1

io non sono sicuro di quello che si vuole fare:

  • In una esecuzione plug-in Eclipse, mostra tutte le classi che sono in esecuzione nella JVM con il plug-in (cioè classi per altri editori, visualizzazioni, macchinari Eclipse)?
  • In un plug-in Eclipse in esecuzione, mostrare tutte le classi in fase di costruzione in progetti Java aperti nell'area di lavoro? (Dal momento che hai usato la parola "workspace", ho il sospetto che questo è quello che stai cercando.)

Nota in quest'ultimo caso, non sarà in grado di ottenere effettivi Java Class<...> oggetti, perché i progetti di essere modificati e compilati non vengono caricati per l'esecuzione nella stessa JVM del tuo plug-in. Il codice del plug-in verrà eseguito insieme al codice dello strumento Eclipse IDE e Eclipse JDT; le sole classi temporali in progetti aperti verrebbero caricate per l'esecuzione (producendo oggetti Class<...> da qualche parte) quando si avvia o esegue il debug di uno di questi progetti. . . nel qual caso hai a che fare con una JVM nuova di zecca e il tuo plug-in non è più in circolazione. Ha senso?

Se sto leggendo bene, penso che probabilmente vorrai trovare "unità di compilazione", non "file di classe". Le "unità di compilazione" corrispondono ai file di origine .java, mentre i "file di classe" corrispondono ai file di classi binari predefiniti (spesso in JAR). O forse hai bisogno di entrambi. Meglio ancora, suona come quello che vuoi veramente sono i "tipi" all'interno di quelli.

Controlla le JDT Core guide per alcune informazioni piuttosto buone che è notevolmente difficile da trovare. Si noti che alcune analisi sono possibili a livello di modello Java, ma analisi più dettagliate (ad esempio la ricerca di definizioni di metodi "all'interno") richiederanno l'analisi di blocchi di codice in AST e andranno da lì. Il modello Java è piuttosto comodo da usare, ma la roba di AST può essere un po 'scoraggiante al primo tentativo.

Considerare anche il motore di ricerca Java (documentato vicino a quanto sopra) e IType.newTypeHierarchy() per la ricerca e la navigazione dei tipi.

Buona fortuna!

1

Si dovrebbe provare:

for (final ICompilationUnit compilationUnit : packageFragment.getCompilationUnits()) { 
     // now check if compilationUnit.exits 
} 

non si ottiene un CompilationUnit per i tipi di binari.

0

Ho una soluzione molto più semplice per un progetto di eclissi se stai cercando di elencare i nomi delle classi java per il pacchetto corrente e aggiungerli a un elenco di classi (si prega di sostituire PARENT_CLASS con il nome della classe genitore di tutte le classi) :

List<PARENT_CLASS> arrayListOfClasses = new ArrayList<>(); 

    String currentDir = new java.io.File("").toURI().toString().split("file:/")[1]; 
    System.out.println("currentDir=" + currentDir); 
    String[] dirStringTab = currentDir.split("/"); 
    String currentPackageName = dirStringTab[dirStringTab.length-1]; 
    System.out.println("currentPackageName=" + currentPackageName); 

    File dir = new File("./src/" + currentPackageName + "/"); 
    File[] filesList = dir.listFiles(); 
    String javaClassNameWithoutExtension = ""; 

    for (File file : filesList) { 
     if (file.isFile()) { 
      System.out.println(javaClassNameWithoutExtension); 
      javaClassNameWithoutExtension = file.getName().split(".java")[0]; 

     Class c = Class.forName(javaClassNameWithoutExtension); 
     Object a = c.newInstance(); 
     arrayListOfClasses.add(a); 

     } 
    } 
Problemi correlati