2012-03-26 6 views
2

Mein Google Foo versagt mich. Wenn ich ein Framework habe, das Codegenerierung basierend auf Annotationen durchführen kann, und ich möchte beide Build-Zeit Quelle Codegenerierung unterstützen, so dass der Entwickler es im Voraus kompilieren kann, auch sehen, was generiert wird, und möglicherweise sogar ändern der Code, sondern bieten auch Laufzeit Bytecode Generation für mehr dynamische Anwendungen, zum Beispiel plugin-basierte Anwendungen, kann ich ASM für beide Aufgaben verwenden, oder muss ich wirklich das zweimal programmieren, mit zwei verschiedenen Bibliotheken? Wenn es möglich ist, wäre ein Link zu einem Beispiel willkommen.Kann ich sowohl Java-Bytecode als auch Quellcode mit dem gleichen "Generator" mit ASM erzeugen?

Antwort

3

Während dies die Frage nicht direkt beantwortet, empfehle ich die Verwendung von Javassist über ASM.

Mit JavaSist starten Sie mit dem Generieren des Quellcodes und Sie geben ihn einfach dem JavaServer-Compiler, um ihn in Bytecode umzuwandeln, so dass Sie nun beide ohne zusätzliche Tricks zur Verfügung haben. Plus, IMHO, Generierung von Quellcode für Javassist ist viel einfacher als Herumspielen mit Bytecode und ASM.

+0

Ich kann Ihren Standpunkt sehen. Ich habe Javaassist vor einer Weile angeschaut. Wenn niemand weiß, dann werde ich das wahrscheinlich tun. –

+0

Ich habe es nochmal angeschaut, und ich bin mir nicht sicher, wie ich das mit Javassist machen soll. Ihr "Quellcode", den Sie verwenden, um die Klassendateien zu generieren, wird wahrscheinlich Dinge wie "$ cflow (...)" enthalten, also ist es kein echter Java-Code. Und ich kann nur Methoden sehen, um die kompilierte Klasse in CtClass zu speichern. Sind Sie sicher, dass dies unterstützt wird? –

+0

Keine andere Antwort nach einem Tag. Darf mit ASM nicht möglich sein, damit Sie die Punkte bekommen. –

1

Für Build-Zeit-Code-Generierung empfehle ich die Verwendung von Eclipse Java Compiler, die keine offene API dafür hat, aber die ist eigentlich sehr einfach zu bedienen. Sie können sehen, wie Sie es hier verwenden können: http://git.jetbrains.org/?p=mps/mps.git;a=tree;f=core/kernel/source/jetbrains/mps/compiler;h=6787147e3b36899574f042dd2132a4c08963670e;hb=HEAD (Dieser Code wurde meist von mir geschrieben). Es gibt auch ein Beispiel dafür, wie Sie kompilierte Klassen dynamisch laden können (innere Klasse MyClassLoader).

+0

Ich bin mir nicht sicher, ob das für mich nützlich ist, aber ich gebe dir +1 für den Tippfehler: "Du kannst es hier * verklagen * LOL! –

Verwandte Themen