2010-07-17 15 views
7

Ich schreibe ein Eclipse-Plugin, und ich habe versucht, eine Methode zu erstellen, die alle Klassen im Arbeitsbereich in einer ArrayList < \ Class < \? >> (Ich fügte die " \ "um die generischen klammern zu enthalten, da html es mir sonst nicht erlauben würde". HierAbrufen aller Klassen aus dem aktuellen Arbeitsbereich in Eclipse

ist der Code, den ich habe:

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

Dies ist jedoch nicht zu funktionieren scheint. Ich hatte einige Printlines, und ich fand heraus, dass es auch irrelevante Klassen (dh Klassen aus Java \ jre6 \ lib \ rt.jar) enthält. Irgendwelche Vorschläge?

+0

zu http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_int_model.htm vertretend Hier können Sie einen finden ziemlich gute Beschreibung des JDT-Modells. – GeT

Antwort

0

Vielleicht können Sie IJavaProject.getAllPackageFragmentRoots() -Methode verwenden, um alle Quellordner zu erhalten, und dann ICompilationUnits in es erhalten.

1

Ich bin nicht sicher, was Sie tun möchten:

  • in einem laufenden Eclipse-Plug-in, alle Klassen zeigen, die mit dem Plug-in (dh Klassen für andere Editoren in der JVM ausgeführt werden, Ansichten, Eclipse-Maschinen)?
  • Zeigen Sie in einem laufenden Eclipse-Plug-in alle Klassen an, die in offenen Java-Projekten im Arbeitsbereich erstellt werden? (Da Sie das Wort „Workspace“, ich vermute, das ist das, was Sie suchen.)

Hinweis im letzteren Fall, werden Sie nicht in der Lage sein, aktuelle Java-Class<...> Objekte zu bekommen, weil die Projekte sein Bearbeitete und kompilierte Dateien werden nicht zur Ausführung in dieselbe JVM wie Ihr Plug-In geladen. Der Code Ihres Plug-Ins wird neben dem Eclipse-IDE- und Eclipse-JDT-Toolcode ausgeführt. Die einzigen Zeitklassen in offenen Projekten würden für die Ausführung geladen werden (Class<...> Objekte irgendwo produzieren) wäre, wenn Sie eines dieser Projekte starten oder debuggen. . . In diesem Fall handelt es sich um eine brandneue JVM, und Ihr Plug-in ist nicht mehr verfügbar. Ist das sinnvoll?

Wenn ich dich richtig lese, denke ich, dass du wahrscheinlich "Kompilierungseinheiten", nicht "Klassendateien" finden willst. "Kompilierungseinheiten" entsprechen .java Quelldateien, während "Klassendateien" mit vordefinierten binären Klassendateien (oft in JARs) übereinstimmen. Oder vielleicht brauchst du beides. Besser noch, es klingt wie das, was Sie wirklich wollen, sind die "Typen" in denen.

Schauen Sie sich die JDT Core guide für einige ziemlich gute Informationen, die bemerkenswert schwer zu finden ist. Beachten Sie, dass einige Analysen auf der Java-Model-Ebene möglich sind, aber detailliertere Analysen (z. B. das Suchen nach "internen" Methodendefinitionen) erfordern das Parsen von Codestücken in ASTs und das Gehen von dort. Das Java-Modell ist ziemlich praktisch zu benutzen, aber das AST-Zeug kann beim ersten Mal etwas entmutigend sein.

Beachten Sie auch die Java-Suchmaschine (dokumentiert in der Nähe des obigen) und IType.newTypeHierarchy() zum Suchen und Navigieren von Typen.

Viel Glück!

1

sollten Sie versuchen:

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

Sie erhalten keine Compilation für binäre Typen.

0

Ich habe eine viel einfachere Lösung für ein Eclipse-Projekt, wenn Sie nur nach Java-Klassennamen für das aktuelle Paket suchen und diese zu einer Liste von Klassen hinzufügen möchten (ersetzen Sie PARENT_CLASS durch den übergeordneten Klassennamen aller Klassen). :

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); 

     } 
    } 
Verwandte Themen