Frage

Ist es möglich, den Pseudo-Syntaxbaum (AST) innerhalb der javac.exe programmatisch zugreifen? Können Sie ein Beispiel nennen?

War es hilfreich?

Lösung

Ja, es ist möglich, aber nur da Java 6. Peter von der Ahe spricht über die zwei JSRs in Interview . Von JSR 199:

  

Der JSR 199 Compiler API besteht aus drei Dinge: Die erste im Grunde können Sie einen Compiler über die API aufzurufen. Zweitens erlaubt die API Sie anpassen, wie der Compiler findet und Dateien schreibt. Ich meine Dateien in abstrakten Sinn, da die Dateien der Compiler behandelt sind nicht unbedingt auf das Dateisystem. JSR 199 Datei Abstraktion können Sie Dateien in einer Datenbank haben, und die Ausgabe direkt in den Speicher zu erzeugen, zum Beispiel. Schließlich läßt die JSR 199 API Sie die Diagnose vom Compiler in einer strukturierten Art und Weise zu sammeln, so dass Sie leicht Fehlermeldungen umwandeln können, zum Beispiel, in Linien in einem Editor IDE.

JSR 269 ist die Anmerkung Verarbeitung API.

Dieser Artikel gibt einen hervorragenden Überblick über den Zugriff auf die Compiler Baum API . Der Abschnitt " Zugriff auf den abstract Syntax-Baum: der Compiler Baum API “für Ihre Frage besonders geeignet erscheint.

Je nachdem, was Sie tun, können Sie auch auf der Jackpot Regelsprache , das ist eine eigenständige Refactoring-Engine, dass Plug-in in den Compiler-Baum.

Andere Tipps

Kompilieren und Ausführen dieses mit -cp tools.jar (wo Sie den Speicherort Ihrer tools.jar angeben müssen, natürlich).

import com.sun.source.util.Trees;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class JCTreeTest {
    private static final JavaCompiler javac
            = ToolProvider.getSystemJavaCompiler();

    public static void main(String[] args) {
        final StandardJavaFileManager jfm
                = javac.getStandardFileManager(null, null, null);
        final JavaCompiler.CompilationTask task
                = javac.getTask(null, jfm, null, null, null,
                  jfm.getJavaFileObjects(args));
        final Trees trees = Trees.instance(task);
        // Do stuff with "trees"
    }
}

Es kompiliert und läuft für mich, obwohl ich nicht mit den Bäumen Du mit mir gespielt haben, so dass Sie auf lesen Sie die javadoc selbst. :-) Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top