Кажется, «проблема двойного прыжка». Когда клиент, веб-сервер и SQL-сервер находятся на разных компьютерах, необходимо разрешить делегирование между этим веб-сервером и SQL-сервером. Это устанавливается в инструменте «Пользователи и компьютеры AD» на вкладке «Делегирование» свойств компьютера.
Подробнее о том, что такое «проблема двойного прыжка» и как ее решить, вы можете найти в следующей статье: https://blogs.msdn.microsoft.com/crm/2012/09/19/enabling -kerberos-for-microsoft-dynamic-crm-2011 /
Попробуйте это:
def cl = Class.forName("org.package.Foo")
cl.get(1)
Немного дольше, но должен работать.
, Если Вы хотите создать "переключатель" - как код для статических методов, я предлагаю инстанцировать классов (даже если у них есть только статические методы), и сохраните экземпляры в карте. Можно затем использовать
map[name].get(1)
для выбора одного из них.
[РЕДАКТИРОВАНИЕ] "$name"
GString
и как таков допустимый оператор. "$name".foo()
означает, "называют метод foo()
из класса GString
.
[EDIT2] При использовании веб-контейнера (как Grails), необходимо указать classloader. Существует две опции:
Class.forName("com.acme.MyClass", true, Thread.currentThread().contextClassLoader)
или
Class.forName("com.acme.MyClass", true, getClass().classLoader)
первая опция будет работать только в веб-контексте, второй подход также работает на модульные тесты. Это зависит от того, что можно обычно использовать тот же classloader в качестве класса, который вызывает forName()
.
, Если у Вас есть проблемы, затем используйте первую опцию и установите contextClassLoader
в Вашем модульном тесте:
def orig = Thread.currentThread().contextClassLoader
try {
Thread.currentThread().contextClassLoader = getClass().classLoader
... test ...
} finally {
Thread.currentThread().contextClassLoader = orig
}
Как предложил Guillaume Laforge на Groovy ML,
("Foo" as Class).get(i)
дал бы тот же результат.
я протестировал с этим кодом:
def name = "java.lang.Integer"
def s = ("$name" as Class).parseInt("10")
println s
Другой способ
import org.codehaus.groovy.grails.commons.ApplicationHolder as AH
def target = application.domainClasses.find{it.name == 'ClassName'}
target.clazz.invokeMethod("Method",args)
При этом вам не нужно указывать имя пакета. Однако будьте осторожны, если у вас одно и то же имя класса в двух разных пакетах.