Groovy способ динамично вызвать статический метод

Кажется, «проблема двойного прыжка». Когда клиент, веб-сервер и SQL-сервер находятся на разных компьютерах, необходимо разрешить делегирование между этим веб-сервером и SQL-сервером. Это устанавливается в инструменте «Пользователи и компьютеры AD» на вкладке «Делегирование» свойств компьютера.

Подробнее о том, что такое «проблема двойного прыжка» и как ее решить, вы можете найти в следующей статье: https://blogs.msdn.microsoft.com/crm/2012/09/19/enabling -kerberos-for-microsoft-dynamic-crm-2011 /

https://blogs.technet.microsoft.com/taraj/2009/01/29/checklist-for-double -hop-questions-iis-and-sql-server /

Как запустить сценарий R (с подключением к базе данных с помощью встроенной аутентификации Windows) на удаленном компьютере под локальным именем пользователя? [ 112]

27
задан cdeszaq 12 January 2014 в 03:17
поделиться

3 ответа

Попробуйте это:

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
}
16
ответ дан Aaron Digulla 28 November 2019 в 05:05
поделиться

Как предложил Guillaume Laforge на Groovy ML,

("Foo" as Class).get(i)

дал бы тот же результат.

я протестировал с этим кодом:

def name = "java.lang.Integer"
def s = ("$name" as Class).parseInt("10")
println s
29
ответ дан chanwit 28 November 2019 в 05:05
поделиться

Другой способ

import org.codehaus.groovy.grails.commons.ApplicationHolder as AH

def target = application.domainClasses.find{it.name == 'ClassName'}
target.clazz.invokeMethod("Method",args)

При этом вам не нужно указывать имя пакета. Однако будьте осторожны, если у вас одно и то же имя класса в двух разных пакетах.

2
ответ дан 28 November 2019 в 05:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: