Groovy вызывает непреднамеренный метод "get (String)" в базовом классе скрипта - PullRequest
0 голосов
/ 12 июня 2018

У меня есть небольшая программа, которая позволяет ее пользователю выполнять произвольный код Groovy.Я использую базовый класс groovy.lang.Script, который предоставляет несколько методов, один из которых называется get.Весь этот код написан на Java.

Базовый класс:

import groovy.lang.Script;
public class ScriptClass extends Script {

    @Override
    public Object run() {
        return null;
    }

    //many other methods

    public String get(String uri) {
        System.out.println("get called with '" + uri + "'");
        return uri;
    }
}

Приведенный выше метод get(String) предназначен для использования в качестве псевдонима для http(method=GET).

Вызов Groovy для оболочки:

public static void main(String[] args) throws Exception {
    CompilerConfiguration compilerConfiguration = new CompilerConfiguration();
    compilerConfiguration.setScriptBaseClass(ScriptClass.class.getName());

    GroovyShell groovyShell = new GroovyShell(compilerConfiguration);

    Map<String, Object> map = new HashMap<>();
    map.put("no", "NO");

    String template = "yes";
    Script script = groovyShell.parse(template);
    script.setBinding(new Binding(map));

    Object res = script.run();
    System.out.println(res);
}

И этот вывод:

вызывается с помощью «да»да

Метод не вызывается при изменении входного кода:

String template = "no";

Я не смог найти объяснения, почему этот метод используетсяВозможно, я пропустил какой-то параграф документации.

Вопросы :

  • Почему Groovy вызывает ScriptClass.get(String), когда скрипт ссылается на переменную, не определенную вСвязывание?
  • Если это стандартное / правильное поведение, есть ли способ предотвратить преобразование разрешения неопределенных переменных в ScriptClass.get(String)?

1 Ответ

0 голосов
/ 12 июня 2018

На самом деле ваш метод get нарушает возможности метапрограммирования groovy.См. Groovy - разница между get и propertyMissing? .Цитата: When you overloaded get, you lost the propertyMissing functionality.

В вашем примере шаблон всегда оценивается.С шаблоном no скрипт возвращает NO, что определено в привязке.С шаблоном yes оценивается несвязанная переменная yes, которая, будучи несвязанной, обычно всегда приводит к вызову get и propertyMissing, но прерывается, потому что get переопределен в вашем скрипте.

Вам придется прибегнуть к другому имени метода для get в вашем скрипте.

...