AST (Abstract Syntax Tree)
Seit Groovy 1.6 kann der Entwickler zum ersten Mal AST-Transformationen selbst durchführen. Diese basieren auf Annotationen, die zur Compile-Zeit ausgewertet werden. Bevor der Compiler Bytecode erzeugt, kann man also den AST verändern. Da eine AST recht unübersichtlich werden kann, gibt es seit der Version 1.7 den AST Viewer. Dieser ist eine grafische Applikation, welche man aus der Groovy-Swing-Konsole starten kann, siehe Abb. 1
Eine weitere Neuerung in diesem Bereich, welche die AST-Manipulation wesentlich vereinfacht sind die AST Builder. Genau genommen sind es drei:
- Bilden mit String
- Bilden mit Code
- Bilden mit einer DSL-ähnlichen Struktur
Mit diesen Buildern ist es z.B. möglich, Methodendeklarationen und Methodenrümpfe nach dem Parsen, aber vor der Bytecode-Generierung hinzuzufügen. So könnte beispielsweise eine Methode hinzugefügt werden:
List<ASTNode> result = new AstBuilder().buildFromSpec {method('myMethod', Opcodes.ACC_PUBLIC, String) {parameters {parameter 'parameter': String.class}exceptions {}block {owner.expression.addAll new AstBuilder().buildFromCode {println 'Hello from a synthesized method!'println "Parameter value: $parameter"}}annotations {}}}
Innere Klassen
Groovy 1.7 bietet Support für anonyme innere Klassen, z.B.:
Timer timer = new Timer()timer.schedule(new TimerTask() {void run() {called = true}}, 0)
Weiterhin kann man nun statische und nichtstatische innere Klassen benutzen.
class A {static class B{}}def x = new A.B()
Nichtstatische innere Klassen:
public class Y {public class X {}public X foo() {return new X();}public static X createX(Y y) {return y.new X();}}










