Попробуйте это:
def cl = Class.forName("org.package.Foo")
cl.get(1)
Немного дольше, но должно работать.
Если вы хотите создать подобный переключателю код для статических методов, я предлагаю создать экземпляры классов (даже если они имеют только статические методы) и сохранить экземпляры на карте. Затем вы можете использовать
map[name].get(1)
, чтобы выбрать один из них.
[РЕДАКТИРОВАТЬ] "$name"
является GString
и, таким образом, действительным утверждением. "$name".foo()
означает «вызов метода foo()
класса GString
.
[EDIT2] При использовании веб-контейнера (например, Grails) необходимо указать загрузчик классов. Есть два варианта:
Class.forName("com.acme.MyClass", true, Thread.currentThread().contextClassLoader)
или
Class.forName("com.acme.MyClass", true, getClass().classLoader)
Первый вариант будет работать только в веб-контексте, второй подход также работает для модульных тестов. Это зависит от того факта, что вы обычно можете использовать тот же загрузчик классов, что и класс, который вызывает forName()
.
Если у вас есть проблемы, используйте первый вариант и установите contextClassLoader
в своем модульном тесте:
def orig = Thread.currentThread().contextClassLoader
try {
Thread.currentThread().contextClassLoader = getClass().classLoader
... test ...
} finally {
Thread.currentThread().contextClassLoader = orig
}