Annotation Processing Tool - Source Code Generierung

Status
Nicht offen für weitere Antworten.

Amin28

Neues Mitglied
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:

* 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.
 

Ralf Ueberfuhr

Bekanntes Mitglied
Ein Processor oder zu verarbeitetende Ressourcen ist nix wert. Du brauchst also Javacode und korrekterweise auch eine eigene Annotation, mit der du den Beispielcode versiehst.
Deine Factory sollte dann bei den supportedAnnotations keine leere Liste rausgeben, sondern eine Liste mit genau dieser Annotation.

Jetzt käme der Punkt, wo du auf der Kommandozeile das APT aufrufst und diese Klasse samt ClassPath per Kommandozeilenparameter übergibst. Optional kannst du es vorher auch erst in ein JAR packen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
FHEFHJHFJH error: class names, 'summe_bsp', are only accepted if annotation processing is explicitly requested Java Basics - Anfänger-Themen 3
A Android-Lib: Sourcecode Generator mittels Annotation Processing Java Basics - Anfänger-Themen 0
S Compiler-Fehler annotation processing is explicitly requested Java Basics - Anfänger-Themen 3
M Java annotation processing Java Basics - Anfänger-Themen 2
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
S Annotation Java Basics - Anfänger-Themen 4
S Annotation Java Basics - Anfänger-Themen 2
D hibernate annotation Java Basics - Anfänger-Themen 2
F Sinn der SuppressWarnings("unused")-Annotation Java Basics - Anfänger-Themen 5
C required fields in klasse mit annotation realisierbar? Java Basics - Anfänger-Themen 10
A Statische Methode "vererben" - Zwang durch annotation processor Java Basics - Anfänger-Themen 10
B Annotation: Retention Java Basics - Anfänger-Themen 5
B Annotation : @Override Java Basics - Anfänger-Themen 9
S String Konstante kann nicht fuer Annotation verwendet werden Java Basics - Anfänger-Themen 2
H class names, are only accepted if annotation . Java Basics - Anfänger-Themen 3
Spandeli8 Erzeugte Objekte gegenüber Bildern hervorheben in Java Processing Java Basics - Anfänger-Themen 1
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
W Processing bestimmtes Feld einfärben Java Basics - Anfänger-Themen 8
T Processing: Quecksilberartiger Ball Java Basics - Anfänger-Themen 2
H kleines Spiel [Processing] Java Basics - Anfänger-Themen 7
J JEP 343: Packaging Tool (Incubator) Java Basics - Anfänger-Themen 1
D Java-API mit Command Line Tool für Rasenroboter umsetzen Java Basics - Anfänger-Themen 10
F Typeahead-Tool stürzt ab Java Basics - Anfänger-Themen 6
L Jar aus Jar Starten lassen (Update Tool) Java Basics - Anfänger-Themen 6
N Tool Tipp für Radio Button Java Basics - Anfänger-Themen 3
J Java Installing Tool Java Basics - Anfänger-Themen 3
B Erste Schritte Javadoc Tool Java Basics - Anfänger-Themen 7
V Tool zum Umrechnen Dezimal in Hex Java Basics - Anfänger-Themen 7
J Java Tool unter Windows ausführen Java Basics - Anfänger-Themen 8
R Welches Tool soll ich benutzen? Java Basics - Anfänger-Themen 19
G gutes Reporting Tool welches mit Java zusammenarbeitet Java Basics - Anfänger-Themen 8
G GUI Tool Java Basics - Anfänger-Themen 2
L welches tool NetBeans 6.0.1 oder Eclipse ? Java Basics - Anfänger-Themen 11
G Forum überwachungs tool Java Basics - Anfänger-Themen 5
1 Ansatz/Hilfe für ein Tool gesucht Java Basics - Anfänger-Themen 4
P Setup-Tool Java Basics - Anfänger-Themen 2
D Suche immernoch ein tool. Java Basics - Anfänger-Themen 16
P Flashähnliches Tool für Java, gibt es so was? Java Basics - Anfänger-Themen 12
J Tool Tip Im TExtfeld von JTable Java Basics - Anfänger-Themen 5
F kostenloses, gutes UML Tool zum rumprobieren Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben