Ich suche nach einem Framework zum Generieren von Java-Quelldateien.
So etwas wie die folgende API:
X clazz = Something.createClass("package name", "class name");
clazz.addSuperInterface("interface name");
clazz.addMethod("method name", returnType, argumentTypes, ...);
File targetDir = ...;
clazz.generate(targetDir);
Dann sollte eine Java-Quelldatei in einem Unterverzeichnis des Zielverzeichnisses gefunden werden.
Kennt jemand einen solchen Rahmen?
EDIT :
- Ich brauche wirklich die Quelldateien.
- Ich möchte auch den Code der Methoden ausfüllen.
- Ich suche eine Abstraktion auf hoher Ebene, keine direkte Manipulation / Generierung von Bytecode.
- Ich brauche auch die "Struktur der Klasse" in einem Baum von Objekten.
- Die Problemdomäne ist allgemein: eine große Anzahl sehr unterschiedlicher Klassen ohne eine "gemeinsame Struktur" zu generieren.
LÖSUNGEN
Ich habe 2 Antworten basierend auf Ihren Antworten veröffentlicht ... mit CodeModel und mit Eclipse JDT .
Ich habe CodeModel in meiner Lösung verwendet, :-)
java
eclipse
code-generation
Daniel Fanjul
quelle
quelle
Antworten:
Sun bietet eine API namens CodeModel zum Generieren von Java-Quelldateien mithilfe einer API. Es ist nicht die einfachste Sache, Informationen zu erhalten, aber es ist da und es funktioniert sehr gut.
Der einfachste Weg, es zu erreichen, ist als Teil des JAXB 2 RI - der XJC-Schema-zu-Java-Generator verwendet CodeModel, um seine Java-Quelle zu generieren, und er ist Teil der XJC-Jars. Sie können es nur für das CodeModel verwenden.
Hol es dir von http://codemodel.java.net/
quelle
Lösung mit CodeModel gefunden
Danke, Skaffman .
Zum Beispiel mit diesem Code:
Ich kann diese Ausgabe erhalten:
quelle
cm._class(...)
als Rückgabetypargument fürdc.method(...)
.Lösung gefunden mit Eclipse JDTs AST
Danke, Giles .
Zum Beispiel mit diesem Code:
Ich kann diese Ausgabe erhalten:
quelle
Sie können Roaster ( https://github.com/forge/roaster ) verwenden, um Code zu generieren.
Hier ist ein Beispiel:
zeigt die folgende Ausgabe an:
quelle
Eine andere Alternative ist Eclipse JDTs AST. Dies ist gut, wenn Sie beliebigen Java-Quellcode neu schreiben müssen, anstatt nur Quellcode zu generieren. (und ich glaube, es kann unabhängig von Eclipse verwendet werden).
quelle
Das Eclipse JET- Projekt kann zur Generierung von Quellen verwendet werden. Ich glaube nicht, dass die API genau der von Ihnen beschriebenen entspricht, aber jedes Mal, wenn ich von einem Projekt gehört habe, das Java-Quellen generiert, haben sie JET oder ein selbst entwickeltes Tool verwendet.
quelle
Sie kennen keine Bibliothek, aber eine generische Vorlagen-Engine ist möglicherweise alles, was Sie benötigen. Es gibt eine Menge von ihnen , ich persönlich habe gute Erfahrungen mit FreeMarker gemacht
quelle
Ich habe etwas gebaut, das Ihrem theoretischen DSL sehr ähnlich sieht, "sourcegen" genannt, aber technisch gesehen anstelle eines util-Projekts für ein ORM, das ich geschrieben habe. Das DSL sieht aus wie:
https://github.com/stephenh/joist/blob/master/util/src/test/java/joist/sourcegen/GClassTest.java
Es werden auch einige nette Dinge erledigt, wie "Importe automatisch organisieren", alle FQCNs in Parametern / Rückgabetypen, alte Dateien, die in diesem Codegen-Lauf nicht berührt wurden, automatisch bereinigen, innere Klassen korrekt einrücken usw.
Die Idee ist, dass generierter Code hübsch aussehen sollte, ohne Warnungen (nicht verwendete Importe usw.), genau wie der Rest Ihres Codes. So viel generierter Code ist hässlich zu lesen ... es ist schrecklich.
Wie auch immer, es gibt nicht viele Dokumente, aber ich denke, die API ist ziemlich einfach / intuitiv. Das Maven Repo ist hier, wenn jemand interessiert ist.
quelle
Wenn Sie die Quelle WIRKLICH brauchen, weiß ich nichts, was die Quelle erzeugt. Sie können jedoch ASM oder CGLIB verwenden , um die .class-Dateien direkt zu erstellen.
Möglicherweise können Sie aus diesen Quellen generieren, aber ich habe sie nur zum Generieren von Bytecode verwendet.
quelle
Ich habe es selbst für ein Mock-Generator-Tool gemacht. Dies ist eine sehr einfache Aufgabe, selbst wenn Sie die Formatierungsrichtlinien von Sun befolgen müssen. Ich wette, Sie würden den Code, der es schneller macht, fertigstellen, als Sie im Internet etwas gefunden haben, das zu Ihrem Ziel passt.
Sie haben die API im Grunde selbst beschrieben. Füllen Sie es jetzt einfach mit dem eigentlichen Code!
quelle
Es gibt auch StringTemplate . Es ist vom Autor von ANTLR und ist ziemlich mächtig.
quelle
Es gibt ein neues Projekt zum einmaligen Schreiben . Vorlagenbasierter Codegenerator. Sie schreiben eine benutzerdefinierte Vorlage mit Groovy und generieren eine Datei in Abhängigkeit von Java-Reflexionen. Dies ist der einfachste Weg, eine Datei zu generieren. Sie können Getter / Settest / ToString erstellen, indem Sie AspectJ-Dateien, SQL basierend auf JPA-Anmerkungen, Einfügungen / Aktualisierungen basierend auf Aufzählungen usw. generieren.
Vorlagenbeispiel:
quelle
Es hängt wirklich davon ab, was Sie versuchen zu tun. Codegenerierung ist ein Thema für sich. Ohne einen bestimmten Anwendungsfall schlage ich vor, die Geschwindigkeitscode-Generierung / Vorlagenbibliothek zu betrachten. Wenn Sie die Codegenerierung offline durchführen, würde ich empfehlen, ArgoUML zu verwenden, um vom UML-Diagramm / Objektmodell zum Java-Code zu wechseln.
quelle
Beispiel: 1 /
2 /
quelle
Hier ist ein JSON-zu-POJO-Projekt, das interessant aussieht:
http://www.jsonschema2pojo.org/
quelle