Я пытаюсь реализовать несколько общих DSL с Java и Groovy. Идея состоит в том, чтобы иметь синтаксис типа data { name 'my name' }
и перехватывать все вызовы метода с помощью methodMissing
, где я могу проверить, что имя метода равно полю, и установить его, запустив замыкание. Я использую Java для написания своего класса данных, и это выглядит так.
public class TestData {
@Getter @Setter
protected String name;
public void call(Closure closure) {
closure.setResolveStrategy(Closure.DELEGATE_FIRST);
closure.setDelegate(this);
closure.call();
}
public Object methodMissing(String name, Object args) {
// here we extract the closure from arguments, etc
return "methodMissing called with name '" + name + "' and args = " + argsList;
}
}
Код для запуска сценария DSL:
TestData testData = new TestData();
Binding binding = new Binding();
GroovyShell shell = new GroovyShell(binding);
binding.setVariable("data", testData);
Object result = shell.evaluate("data { name 'my test data' }");
Проблема в том, что closure.call()
возвращает MissingMethodException
:
groovy.lang.MissingMethodException: No signature of method: Script1.name() is applicable for argument types: (java.lang.String) values: [my test data]
Как я могу заставить его перенаправить вызовы метода к его делегату и искать его methodMissing
метод?