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