Я пишу маленький Groovy DSL
, который полагается на Groovy Closures
. Затем я запускаю DSL
из программы Java
с использованием GroovyShell
и DelegatingScript
.Groovy Закрытие не проверяя владельца или делегата области
код вызова сценария из Java:
DelScript project = new DelScript();
CompilerConfiguration cc = new CompilerConfiguration();
cc.setScriptBaseClass("groovy.util.DelegatingScript");
GroovyShell sh = new GroovyShell(Launcher.class.getClassLoader(), new Binding(), cc);
DelegatingScript script = (DelegatingScript) sh.parse(new File(path));
script.setDelegate(project);
script.run();
Экземпляр DelScript
работ как this
ссылки внутри сценария, например, любой член или метод, не найденный в самом скрипте, выполняется в случае DelScript
.
Мой сценарий может включать в себя следующие выражения:
create (name: "test") {
// this code can be used to initialize the
// object that is created here
testProperty = "I'm an example"
}
Цель этого кода для создания объекта, а затем вызвать замыкание, которое может быть использовано для его инициализации. Как я уже говорил, метод create
находится в экземпляре DelScript
, (который является то, что я хочу), и это выглядит следующим образом:
def create(arguments, configClosure) {
// create new object
def x = new Impl(arguments)
// use configClosure to init it
configClosure.delegate = x
configClosure()
}
Хотя я поставил delegate
в configClosure
, я получаю ошибку что testProperty
не является частью DelScript
. Я знаю, что экземпляр DelScript
- это , так как я создал его в области DelScript
, но я думал, что закрытие будет проверять ссылки в порядке: . Он никогда не проверяет delegate
в моем случае, но вызывает исключение сразу после проверки this
.
Может ли кто-нибудь дать мне отзыв о том, что я делаю неправильно?