2015-01-18 1 views
0

Я пишу маленький 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.

Может ли кто-нибудь дать мне отзыв о том, что я делаю неправильно?

ответ

1

После строки

configClosure.delegate = x 

Помещенный

configClosure.resolveStrategy = Closure.DELEGATE_FIRST 

 Смежные вопросы

  • Нет связанных вопросов^_^