Реализуйте methodMissing () для закрытия делегата - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь реализовать несколько общих 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 метод?

...