Invocación de Métodos de POJOs

Para un POJO Groovy carga su metaclase usando MetaClassRegistry y delega la invocación a la misma.

Cualesquiera interceptores que se hayan definido en su metaclase tomarán precedencia sobre el método original del POJO.

En este programa modificamos el método toString de los objetos Integer usando el atributo metaClass de la clase Integer:

~/Lgroovy/mop$ cat -n InterceptingIntegerViaMetaClass.groovy 
     1  #!/usr/bin/env groovy
     2  
     3  Scanner sc = new Scanner(System.in)
     4  
     5  Integer n
     6  print "Give me an unsigned integer: "
     7  if (sc.hasNextInt()) n = sc.nextInt() else {
     8    System.err.println ("Error: number expected, found '${sc.next()}' instead")
     9    System.exit(1)
    10  }
    11  
    12  
    13  def names = ['zero', 'one', 'two', 'three', 'four', 'five', 'six',
    14               'seven', 'eight', 'nine' ]
    15  Integer.metaClass.toString = {->
    16    Integer k = delegate
    17    m = ''
    18    while (k != 0) {
    19      r = k % 10
    20      k = k / 10
    21      m = "${names[r]} $m"
    22    }
    23    m
    24  }
    25  
    26  println n.toString()
Cuando se ejecuta presenta la siguiente conducta:
~/Lgroovy/mop$ ./InterceptingIntegerViaMetaClass.groovy 
Give me an unsigned integer: 4567
four five six seven 
~/Lgroovy/mop$ ./InterceptingIntegerViaMetaClass.groovy 
Give me an unsigned integer: hola
Error: number expected, found 'hola' instead
~/Lgroovy/mop$
El objeto delegate dentro de la clausura se refiere al objeto Integer cuyo método toString está siendo modificado.

Casiano Rodríguez León
2010-04-30