2008-12-04 16 views
6

Ich habe einen Post-Compilierungsschritt, der den Java-Bytecode der generierten Klassen manipuliert. Ich möchte den Bibliothekskonsumenten das Leben so schmerzlos wie möglich machen, deshalb suche ich nach Wegen, wie ich diesen Prozess automatisch und (wenn möglich) ohne Agnostiker machen kann.Einstecken in Java-Compiler

Die Annotation Processing API bietet viele der gewünschten Funktionen (automatische Erkennung von Diensten; von Eclipse unterstützt). Leider ist dies bei Code-Generatoren und doesn't support manipulation of existing artefacts Ziel:

Die ersten Eingänge mit dem Werkzeug betrachtet von der nullten Runde geschaffen werden; Wenn Sie daher versuchen, eine Quell- oder Klassendatei zu erstellen, die einem dieser Eingaben entspricht, wird eine FilerException ergeben.

Das von der API empfohlene Decorator-Muster ist keine Option.

Ich kann sehen, wie man den Schritt mit einem Laufzeitagenten/Instrumentierung durchführt, aber das ist eine schlechtere Option als ein manueller Build-Schritt, da jeder peripher von der API berührte, ihre JVMs in einem nicht offensichtlichen zu konfigurieren Weise.

Gibt es eine Möglichkeit, den compiler tool, wie er von javac aufgerufen wird, anzuschließen oder zu wickeln? Hat jemand die Annotation-Prozessoren erfolgreich manipuliert, um Bytecode zu manipulieren, egal was das Dokument sagt?

Antwort

4

Der Groovy Compiler ist der einzige Bytecode-Compiler, der in den Übersetzungsvorgang (Beispiel: Generate bytecode to support the Singleton pattern) einzuhaken ermöglicht

Die Annotation Verarbeitung API nicht den Code ändern soll. Wie Sie bereits herausgefunden haben, können Sie nur einen Classloader installieren, den Bytecode zur Laufzeit untersuchen und manipulieren. Es ist brainadead, aber es funktioniert. Dies folgt dem allgemeinen "Wir haben Angst, dass ein Entwickler etwas Dummes versuchen könnte" Thema, das Sie in ganz Java finden werden. Es gibt keine Möglichkeit, JavaC zu erweitern. Die relevanten Klassen sind entweder privat, endgültig oder ändern sich mit der nächsten Version von Java.

Eine weitere Option ist das Schreiben von annotiertem Java, zum Beispiel schreiben Sie eine Klasse "ExampleTpl.java". Dann verwenden Sie einen Precompiler, der die Anmerkungen in dieser Datei erweitert, um "Example.java" zu erhalten. Im Rest des Codes verwenden Sie Example und ignorieren .

Für Eclipse gibt es eine bug report to automate this step. Mir sind keine anderen Arbeiten in diesem Bereich bekannt.

3

Es kann getan werden.

Werfen Sie einen Blick auf meinen Blogpost Roman Numerals, in our Java, wo ein Annotationsprozessor verwendet wird, um Code neu zu schreiben. Einschränkung ist, dass es nur mit Suns Javaac funktioniert.

+0

Ihr Link ist tot. –