2016-04-12 15 views
1

Wenn ich eine benutzerdefinierte Annotation erstelle (Beispiel: @SaveFuncName("saveMe") fügt eine Methode namens saveMe() mit Code hinzu, den mein Prozessor generiert), kann der Javac Compiler meinen Annotationsprozessor verwenden, um eine Methode zur Klasse hinzuzufügen? Oder kann ich nur eine andere Klasse erstellen?Kann ich einer Klasse eine Methode aus einer Kompilierungszeitanmerkung hinzufügen?

+0

Nein, das ist nicht möglich. Wenn Sie die interne Javac-API lernen, ist es möglich, den Syntaxbaum direkt zu ändern, aber es ist nichts für schwache Nerven. Etwas verwandt: http://stackoverflow.com/questions/13690272/code-replacement-with-annannotation-processor. Am einfachsten ist es, eine Superklasse mit z.B. 'saveMe()' und erweitere es. – Radiodef

+1

@Radiodef Danke. Kannst du das als Antwort posten und ich werde es als beantwortet markieren. –

Antwort

2

Oder kann ich nur eine andere Klasse erstellen?

Das stimmt. Die vorhandene API lässt uns vorhandene Klassen nicht ändern, sondern nur neue generieren.

Technisch gesehen, wenn Sie etwas Hacky-Zeug machen wollen, ist es möglich, die interne Syntax-API zu verwenden, um den abstrakten Syntaxbaum direkt zu ändern, aber es ist nichts für schwache Nerven. Zum Beispiel ist ein Objekt wie TypeElement tatsächlich ein Symbol direkt von Javac, von uns von der Schnittstelle verborgen. Der Syntaxbaum ist auch in einem schreibgeschützten Modus über die compiler tree API verfügbar. Wir können die Schnittstellen wegwerfen und den Code auf diese Weise modifizieren. Dies ist z.B. Project Lombok funktioniert.

(Aber ich kann nicht empfehlen zu tun. Ich bin es meist zu erklären, weil Lombok eine Sache, die es gibt, ist so wie Klassen zu modifizieren aussieht, ist möglich.)

Die einfachste Lösungen sind etwas zu tun erzeugen eine Oberklasse mit zB saveMe() Methoden und erweitern Sie es oder generieren Sie eine Dienstprogrammklasse und delegieren Sie sie. (Auch empfohlen here.)

+0

Da Oracle Lombok in seinem "Java Magazine" vom Mai 2017 vorstellt ... bedeutet das, dass sie sich für Hacky-Kram aussprechen oder APT erlauben könnten, die aktuelle Datei zu ändern? Diese Frage brachte mich hierher, als ich den Artikel las, denn Lombok schien genau das zu tun. Aber ich denke, es gibt keine elegante Möglichkeit, das in die APT-API zu integrieren, und Sie müssten den AST trotzdem bearbeiten. – Stroboskop

+0

@Stroboskop Es ist hacky, weil es undokumentiert ist, also musst du den javac-Quellcode lesen, um herauszufinden, wie es funktioniert. Es könnte sein, dass der Autor dieses Artikels nicht weiß, was Lombok hinter den Kulissen tut. Lombok hat seinen eigenen Klappentext, wenn Sie sehen wollen, was sie sagen: http://jnb.ociweb.com/jnb/jnbJan2010.html#controversy Persönlich hoffe ich, den AST zu modifizieren, oder zumindest nur Methoden hinzuzufügen, wird als hinzugefügt ein Feature, aber ich bezweifle, dass es in nächster Zeit passieren wird. – Radiodef

Verwandte Themen