Hallo liebe Leute,
für meine Diplomarbeit möchte ich mit Hilfe von Annotationen Java Source Code generieren lassen.
Dabei soll der Code-Generator einen beliebigen Java Source Code als Eingabe erhalten, die Annotationen auslesen bzw. auswerten und anschließend den dazugehörigen Java Source Code (Java Swing) in einem Paket generieren und eventuell auch compilieren.
Dies soll ja mittels APT möglich sein, allerdings fehlt mir noch dieser "Aha"-Effekt.
Laut http://entwickler.de/zonen/portale/psecom,id,101,online,659,.html sind folgende Schritte nötig:
Besonders der 2. Punkt bereitet mir noch etwas Kopfschmerzen.
Nehmen wir zum Beispiel folgenden Processor als Beispiel. Wie gehe ich anschließend vor, damit der unten stehende Code generiert wird?
Mir fehlen noch ein paar komplette Beispiele, um den vollständigen Durchblick zu erhalten.
Ich würde mich über jede Hilfe freuen. Auch sind andere Lösungsvorschläge willkommen.
Vielen Dank im Voraus.
Amin
PS Ich kenne mich mit Annotations bestens aus, kann sie in Run-Time (mit Java Reflections) auslesen und ausgeben.
für meine Diplomarbeit möchte ich mit Hilfe von Annotationen Java Source Code generieren lassen.
Dabei soll der Code-Generator einen beliebigen Java Source Code als Eingabe erhalten, die Annotationen auslesen bzw. auswerten und anschließend den dazugehörigen Java Source Code (Java Swing) in einem Paket generieren und eventuell auch compilieren.
Dies soll ja mittels APT möglich sein, allerdings fehlt mir noch dieser "Aha"-Effekt.
Laut http://entwickler.de/zonen/portale/psecom,id,101,online,659,.html sind folgende Schritte nötig:
* Erzeugen Sie eine Annotation Processor Factory.
* Erzeugen Sie einen Annotation Processor, der über die Factory zurückgegeben wird. Übergeben Sie die Factory über den Parameter -factory an das apt-Tool. Eine weitere Möglichkeit besteht in der Erzeugung eines JAR-Archivs und dessen Integration in den Klassenpfad.
Besonders der 2. Punkt bereitet mir noch etwas Kopfschmerzen.
Nehmen wir zum Beispiel folgenden Processor als Beispiel. Wie gehe ich anschließend vor, damit der unten stehende Code generiert wird?
Code:
package test;
import java.util.Collection;
import java.util.Set;
import java.util.Collections;
import java.io.IOException;
import java.io.PrintWriter;
import com.sun.mirror.apt.AnnotationProcessorFactory;
import com.sun.mirror.apt.AnnotationProcessor;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;
import com.sun.mirror.declaration.TypeDeclaration;
import com.sun.mirror.declaration.MethodDeclaration;
public class ClassAndMethodPrinterAnnotationProcessorFactory implements AnnotationProcessorFactory {
public Collection<String> supportedOptions() {
return Collections.EMPTY_LIST;
}
public Collection<String> supportedAnnotationTypes() {
return Collections.EMPTY_LIST;
}
public AnnotationProcessor getProcessorFor(Set<AnnotationTypeDeclaration> atds, AnnotationProcessorEnvironment env) {
return new ClassAndMethodPrinterAnnotationProcessor(env);
}
private class ClassAndMethodPrinterAnnotationProcessor implements AnnotationProcessor {
AnnotationProcessorEnvironment env;
public ClassAndMethodPrinterAnnotationProcessor(AnnotationProcessorEnvironment env) {
this.env = env;
}
public void process() {
try {
PrintWriter writer = env.getFiler().createSourceFile("test.ClassAndMethodPrinter");
writer.println("package test;");
writer.println();
writer.println("public class ClassAndMethodPrinter {");
writer.println();
writer.println(" public static void main(String[] args) {");
for (TypeDeclaration typeDeclaration : env.getTypeDeclarations()) {
writer.println(String.format(" System.out.println(\"Class: %s\");",
typeDeclaration.getQualifiedName()));
for (MethodDeclaration methodDeclaration : typeDeclaration.getMethods()) {
writer.println(String.format(" System.out.println(\"Method: %s.%s\");",
typeDeclaration.getQualifiedName(),
methodDeclaration.getSimpleName()));
}
}
writer.println(" }");
writer.println();
writer.println("}");
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
Mir fehlen noch ein paar komplette Beispiele, um den vollständigen Durchblick zu erhalten.
Ich würde mich über jede Hilfe freuen. Auch sind andere Lösungsvorschläge willkommen.
Vielen Dank im Voraus.
Amin
PS Ich kenne mich mit Annotations bestens aus, kann sie in Run-Time (mit Java Reflections) auslesen und ausgeben.