Ich habe einen automatisch generierten Java-Code, den ich gerne hätte automatisch umstrukturieren, bevor es kompiliert wird. Es ist meist Klassenumbenennung und Paketänderung.
[off topic comment: Sie sollten den Code reparieren, der den Code generiert. Generieren von Code automatisch und dann ändern Sie es mithilfe eines anderen Tools sieht nicht wie richtige Vorgehensweise.]
Eclipse bietet eine Refactoring-API , die in Programmen (ohne Eclipse) verwendet werden kann. Ursprüngliches Tool war JDT (ich hatte es benutzt), ich denke die neue Lösung ist LTK - nicht ausprobiert.
Wenn Sie versuchen, die von xjc generierten Paket- und Klassennamen zu steuern, können Sie eine Externe Bindedatei .
Sie würden etwas sagen wie:
%Vor%Und für jeden Klassennamen, den Sie anpassen möchten, hätten Sie:
%Vor% Speichern Sie dies beispielsweise in einer bindings.xjb
-Datei und führen Sie xjc wie folgt aus:
Wie Sie sagten, Sie verwenden "xjc", um den Code zu generieren, und Sie wollen "meist Klassenumbenennung und Paketmodifikation" vielleicht einige der "xjc" -Optionen würden tun, was Sie wollen:
%Vor%Mit "-p" können Sie das Zielpaket definieren, zu dem der generierte Code gehören soll. Für die Verwendung der Bindings-Option finden Sie hier weitere Informationen Ссылка
edit Ein anderer Ansatz könnte sein: die generierten Dateien in das gewünschte Verzeichnis zu verschieben und dann das Replace-Plugin zu verwenden, um die Paketspezifikation in den kopierten Quelldateien zu ersetzen
%Vor%Was Sie wollen, ist ein Programmtransformationssystem (PTS).
Ein PTS liest Quellcode, erstellt eine Programmdarstellung (normalerweise einen abstrakten Syntaxbaum oder AST), wendet Transformationen an (oft angegeben in "Wenn Sie dies sehen, ersetzen Sie es durch das "target langauge" -Oberflächensyntax) in den Baum und kann gültigen Quelltext (oft prettyprinted) aus dem modifizierten AST generieren. Eine Beispielsoberflächensyntax könnte wörtlich wie folgt geschrieben werden (Syntax variiert pro System):
%Vor%Normalerweise wird ein Satz von Transformationsregeln benötigt, die in Zusammenarbeit mit einem Metaprogramm arbeiten, um ein komplexeres Ergebnis zu erzielen. Wie Metaprogramme geschrieben werden, variieren radikal über die PTS.
Im Allgemeinen müssen Sie den PTS so konfigurieren, dass er die gewünschte Zielsprache analysiert / druckt. Stratego, TXL und DMS (mein Werkzeug) haben alle bereits Java-Parser / Prettyprinters und alle haben Oberflächensyntax-Umschreibungen. Angesichts der Wahl von PTS würden Sie Ihren Quellcode generieren und dann einen Prozess starten, um das Tool auszuführen, indem Sie eine Reihe von Transformationen und das entsprechende Metaprogramm verwenden, das Sie bereitstellen, um die gewünschten Codeänderungen zu erzielen. Stratego, glaube ich, hat eine Java-Implementierung, und Sie könnten es vielleicht in Ihre Anwendung integrieren, indem Sie den separaten Prozess vermeiden.
Eine Komplikation besteht darin, dass die gewünschten Transformationen häufig eine Namensauflösung, Typinformationen oder ein gewisses Verständnis des Datenflusses im Code erfordern. Stratego und TXL haben diese Informationen nicht integriert, daher müssen Sie sie bei Bedarf durch Schreiben zusätzlicher Transformationen berechnen. Das ist ein bisschen schwierig, weil die Sprachsemantik komplex ist. Unser Werkzeug, DMS, hat diese Funktionen bereits für Java mit einigen Unvollständigkeiten im Datenfluss abgeschlossen.
Wenn Ihr Problem wirklich nur die Namensubstitution ist und die Namen in Ihrem generierten Code einzigartig sind, dann könnten Sie mit Transformationen wie:
davonkommen %Vor%z.B.
%Vor%(Wenn das wirklich genug ist, könntest du vielleicht mit der Textstring-Substitution durchkommen, anstatt mit einem PTS. Die meiste Zeit meiner Karriere habe ich damit verbracht zu entdecken, dass nichts so einfach ist wie ich gehofft hatte).
Eclipse's JDT könnte eine Alternative sein. Es hat sicherlich einen Parser, aber keine Oberflächen-Syntax-Transformationen, so dass es nicht wirklich ein PTS ist). Stattdessen werden Transformationen in Java programmiert, indem Sie den Baum auf und ab gehen und Änderungen mithilfe von JDT-APIs vornehmen, was ein wenig schmerzhaft ist. AFAIK, bietet es Zugriff auf Namen Informationen, aber nicht Ausdruck Typen, wenn ich es verstehe, und hat keine spezifische Unterstützung für den Datenfluss. Ich verstehe, dass es nicht einfach ist, Eclipse für die Verwendung als Modul zu isolieren. YMMV.
Früher gab es ein eigenständiges Tool namens Löffel , die Java-Parsing, vollständige Namen und Typ-Auflösung zur Verfügung gestellt, aber auf prozedurale Baum-Änderungen hat. Ich weiß nicht, ob moderne Dialekte von Java (z. B. 1.5 oder höher mit Vorlagen) verfolgt wurden.
Es gibt ein Werkzeug namens Löffel. Dieses Projekt ist Open Source und ermöglicht Ihnen die Transformation und Analyse von Java Quellcode mit einem Ansatz Source-to-Source. Es bietet ein komplettes und feingranularisiertes Java-Metamodell, auf das jedes Programmelement (Klassen, Methoden, Felder, Anweisungen, Ausdrücke ...) sowohl zum Lesen als auch zum Ändern zugreifen kann.
Sie können mehr Informationen darüber auf seiner Website: Ссылка .
Um mit Gradle einen Löffel laufen zu lassen, gibt es ein Plugin, das du in dein Projekt einfügen und mit dem Löffel versehen kannst. Klonen Sie dieses Projekt ( Ссылка ) und installieren Sie das Plugin in Ihrem lokalen Repository ( ./gradlew install
). Danach können Sie es in Ihr Projekt einfügen, wie in der Dokumentation des Plugins erklärt ( Ссылка ) ).
Ich hoffe, dass dies jedem neuen Entwickler helfen kann, der an der Quelle der Java-Umwandlung interessiert ist! :)
Tags und Links java gradle ant refactoring