que ejemplos groovy monkeypatching

ejemplos - groovy vs java



Agregue dinámicamente una propiedad o método a un objeto en groovy (1)

Si solo desea agregar el método bye() a la única instancia g de la clase Greet , debe hacer:

g.metaClass.bye = { println "Goodbye, $name" } g.bye()

De lo contrario, para agregar bye() a todas las instancias de Greet (a partir de ahora), llame

Greet.metaClass.bye = { println "Goodbye, $name" }

Pero tendrías que hacer esto antes de crear una instancia de la clase Greet

Aquí hay una página sobre la metaClass por instancia

Y aquí está la página de MetaClasses en general

Además, hay un error en tu constructor. Te estás perdiendo who de enfrente de tu [1..-1] y si al constructor se le pasa una String de menos de 2 caracteres de longitud, lanzará una excepción

Una mejor versión podría ser:

Greet( String who ) { name = who.inject( '''' ) { String s, String c -> s += s ? c.toLowerCase() : c.toUpperCase() } }

Como se mencionó en los comentarios,

Greet( String who ) { name = who.capitalize() }

es la forma correcta

¿Es posible agregar una propiedad o un método a un objeto dinámicamente en Groovy? Esto es lo que he intentado hasta ahora:

class Greet { def name Greet(who) { name = who[0].toUpperCase() + [1..-1] } def salute() { println "Hello $name!" } } g = new Greet(''world'') // create object g.salute() // Output "Hello World!" g.bye = { println "Goodbye, $name" } g.bye()

Pero obtengo la siguiente excepción:

Hello World! Caught: groovy.lang.MissingPropertyException: No such property: bye for class: Greet Possible solutions: name at test.run(greet.groovy:11)