Artikel

 
Januar 2010 | Artikel

Groovy 1.7

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/2811)

Neue Features

Text: Masiar Ighani
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
Nicht mal ein halbes Jahr nach der ersten Beta von Groovy 1.7 haben die Entwickler die Version 1.7 freigegeben. In diesem Release gibt es einige sprachliche Neuerungen, wie innere und geschachtelte Klassen, verbesserten SQL-Support, usw. Aber auch das Tooling wurde verbessert, z.B. die Groovy Console oder Tools für die AST-Transformationen.
Teil 1   Teil 2   

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:

  1. List<ASTNode> result = new AstBuilder().buildFromSpec {
  2. method('myMethod', Opcodes.ACC_PUBLIC, String) {
  3. parameters {
  4. parameter 'parameter': String.class
  5. }
  6. exceptions {}
  7. block {
  8. owner.expression.addAll new AstBuilder().buildFromCode {
  9. println 'Hello from a synthesized method!'
  10. println "Parameter value: $parameter"
  11. }
  12. }
  13. annotations {}
  14. }
  15. }
Innere Klassen

Groovy 1.7 bietet Support für anonyme innere Klassen, z.B.:

  1. Timer timer = new Timer()
  2. timer.schedule(new TimerTask() {
  3. void run() {
  4. called = true
  5. }
  6. }, 0)

Weiterhin kann man nun statische und nichtstatische innere Klassen benutzen.

  1. class A {
  2. static class B{}
  3. }
  4. def x = new A.B()

Nichtstatische innere Klassen:

  1. public class Y {
  2. public class X {}
  3. public X foo() {
  4. return new X();
  5. }
  6. public static X createX(Y y) {
  7. return y.new X();
  8. }
  9. }

Teil 1   Teil 2   

Anzeige

Kommentare


Anzeige

zurück zum Seitenanfang