Prueba esto:
def cl = Class.forName("org.package.Foo")
cl.get(1)
Un poco más largo, pero debería funcionar.
Si desea crear un código tipo "switch" para métodos estáticos, sugiero crear una instancia de las clases (incluso si solo tienen métodos estáticos) y guardar las instancias en un mapa. A continuación, puede usar
map[name].get(1)
para seleccionar uno de ellos.
[EDIT]"$name"
es una GString
y, como tal declaración válida. "$name".foo()
significa "llamar al método foo()
de la clase GString
[Edit2] Cuando se utiliza un contenedor web (como Grails), se tiene que especificar el cargador de clase Hay dos opciones:..
Class.forName("com.acme.MyClass", true, Thread.currentThread().contextClassLoader)
o
Class.forName("com.acme.MyClass", true, getClass().classLoader)
la primera opción sólo funcionará en un contexto web, el segundo método también funciona para las pruebas unitarias. depende del hecho de que por lo general puede use el mismo cargador de clases que la clase que invoca forName()
.
Si tiene problemas, a continuación, utilizar la primera opción y establecer el contextClassLoader
en su prueba de unidad:
def orig = Thread.currentThread().contextClassLoader
try {
Thread.currentThread().contextClassLoader = getClass().classLoader
... test ...
} finally {
Thread.currentThread().contextClassLoader = orig
}
clases no se "invocan" - solo métodos. ¿Qué es exactamente lo que quieres invocar? ¿quieres hacer algo como MyOwnClass.static_property()? o myInstanceOfClass.methodName()? – Chii
Supongo que quiere invocar un método estático en una clase. –
Quiero invocar un método estático en una clase, una clase I que no sé hasta el tiempo de ejecución. Sé que la forma Java es usar Class.forName, era curioso si había una manera Groovy de hacer esto como si fuera por métodos. –