2015-12-16 5 views
5

Wenn Sie Java-Code in Eclipse IDE schreiben, drücken Sie Control + Space öffnet das Inhaltshilfsfenster.
Zum Beispiel listet das Inhaltshilfsfenster für System. alle verfügbaren Felder und Methoden für die Klasse System auf.Eclipse JDT: So erhalten Sie ein Datenmodell für Java content assist

Ich muss auf das "Datenmodell" für das Inhaltshilfsfenster nach Code zugreifen.
Verwenden Sie das obige Beispiel: Wie kann ich mit dem Klassennamen System alle verfügbaren Felder und Methoden abrufen?
Ich verbrachte einige Zeit auf den Quellcode dieser drei Klassen auf grepcode.com:

org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext 
org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposalComputer 
org.eclipse.jdt.ui.text.java.CompletionProposalCollector 

Es ist wie die einer ICompilationUnit Instanz sieht verwendet, um die Felder und Methodennamen zur Verfügung zu stellen.

Dann verstehe ich nicht, wie die ICompilationUnit Instanz für eine Klasse in JRE-System-Bibliothek oder Third-Party-Bibliothek zu generieren? Oder wenn ich den Code nicht richtig gelesen habe, wie hat das Programm dann die Felder und Methoden gefunden? (Ich muss mir keine Gedanken über den Offset- und UI-Inhalt machen, nur den Teil "Datenmodell").

+0

ICompilationUnit ist Teil des JDT [Abstract Syntax Tree] (http://www.vogella.com/tutorials/EclipseJDT/article.html) –

Antwort

0

Sie könnten versuchen, die java reflection API zu verwenden, um alle Mitglieder dieser bestimmten Klasse (YourClass.getMethods() oder YourClass.getDeclaredMethods()) zu erhalten.

Um es dynamisch nach Ihrer Eingabe zu machen, können Sie Class.forName(<fullClassName>) verwenden, um die entsprechende Klasse zu erhalten (siehe this post für weitere Informationen darüber).

Das Problem, das Sie möglicherweise haben, ist, dass Sie den vollen qualifizierten Klassennamen geben müssen, deshalb müssen Sie die Importe überprüfen, um herauszufinden, in welchem ​​Paket Sie nach der entsprechenden Klasse suchen müssen, aber es ist der einzige Weg mit dieser Methode.
Einfache Namen sind einfach nicht immer eindeutig und daher nicht geeignet für diese Art der Suche (here erklärt.

1

Es scheint, dass die einzige Möglichkeit ist, eine (temporäre) Übersetzungseinheit zu schaffen, die wiederum ein richtig eingerichtet werden muß Java-Projekt. Die Infrastruktur ist notwendig für JDT zu wissen, welche JRE verwendet wird, die Compiler-Einstellungen verwendet werden, usw.

Siehe here wie ein Java-Projekt einzurichten und here wie eine Übersetzungseinheit erhalten.

Die Kompilierungseinheit würde aussehen so etwas wie

class Foo { 
    void bar() { 
    java.lang.System. 
    } 
} 

und codeComplete() hätte mit einem Offset aufgerufen wird, dass die Position direkt nach System. bezeichnet.

Verwandte Themen