У меня есть небольшая программа, которая позволяет ее пользователю выполнять произвольный код 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)
?