groovy - sirve - que es string en java
Forma maravillosa de crear instancias dinĂ¡micas de una clase de String (2)
Esto funciona, usando el GroovyClassLoader
subyacente :
def instance = this.class.classLoader.loadClass( ''Item'', true, false )?.newInstance()
Las respuestas de esta pregunta sobre la forma Groovy de invocar dinámicamente un método estático fueron muy útiles, pero estoy teniendo problemas con el siguiente caso:
Definí una clase simple de Groovy:
class Item {
def id = 1
def data = [ "a", "b" ]
}
Luego definí una clase de utilidad simple que quiere cargar dinámicamente la clase Item:
class Util {
static def main(args) {
def cls = "Item" as Class
def instance = cls.newInstance()
println instance.toString()
}
}
Util.groovy está en la misma carpeta que Item.groovy
Cuando intento ejecutar Util.groovy aparece el siguiente error:
Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException:
Cannot cast object ''Item'' with class ''java.lang.String''
to class ''java.lang.Class'' due to:
java.lang.ClassNotFoundException: Item
at Util.main(Util.groovy:3)
La única forma en que podía hacer que funcionara era usando Groovyc para precompilar Item.groovy, pero esto no tiene sentido ser Groovy :)
Simplemente tuve que hacer esto y encontré una manera interesante, así que pensé en volver y mencionarlo.
Tuve un problema con esto porque quería pasarle un valor a newInstance (usar un constructor no predeterminado) y todas las soluciones parecían tener un poco de trabajo (soy flojo, ¿de acuerdo?)
De todos modos, supongamos que quiere crear un nuevo Entero (5) ... intente esto:
c = "java.lang.Integer"
p = "5"
def result = Eval.me("return new ${c}(${p})")
assert(result == 5)
Funcionó muy bien, aunque estoy seguro de que se trata de la solución más lenta posible. Tiene la ventaja de que el método es aplicable a muchas otras situaciones.