Вызов пользовательской функции сценария с помощью ScriptEngine из Java
У меня есть одинаковые пользовательские функции с одинаковыми именами в разных файлах сценариев, написанных на python, groovy и javascript. Пользователь может выбрать один из сценариев, которые хотите использовать. Я хочу вызывать функции из этих сценариев в общем виде.
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("python");
Bindings bindings = engine.createBindings();
engine.eval(new FileReader("C:/Users/Cgr/Desktop/CustomPython.py");
Invocable inv = (Invocable) engine;
System.out.println(inv.invokeFunction("customConcatFunc", "str1", "str2"));
Таким образом, я могу вызывать свои функции, даже меняя параметр ScriptEngineManager на "javascript" или "groovy", меняя файлы для чтения с помощью "CustomJs.js" или "Customgroovy.groovy".
Однако мне интересно, есть ли способ вызывать функции без использования invokeFunction
как ниже:
Сначала оцените скрипт и поместите результат в привязку, а затем вызовите функцию для этого объекта.
bindings.put("x", "str1");
bindings.put("y", "str2");
bindings.put("script", engine.eval(new FileReader("C:/Users/Cgr/Desktop/CustomgrPython.py")));
engine.eval("script.customConcatFunc(x,y)", bindings);
Итак, это самый общий способ для меня, если есть такой путь или есть другие предложения?
1 ответ
Метод ниже может быть полезным, избегая вызова invokeFunction
:
@Test
public void test60_ScriptEngineTest()
throws URISyntaxException, ScriptException, NoSuchMethodException, FileNotFoundException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("groovy");
Compilable compilable = (Compilable) engine;
Bindings bindings = engine.createBindings();
URL url=getClass().getResource("/data-encoder-dir/testFunc.groovy");
File script =new File(url.toURI());
Reader reader = new FileReader(script);
CompiledScript compiledScript = compilable.compile(reader);
bindings.put("x", 5011);
String result = (String) compiledScript.eval(bindings);
assertEquals(result, "5011");
}
Прикрепленный файл (в /data-encoder-dir/testFunc.groovy):
public String testFunc(Integer bd) {
return bd.toString();
}
testFunc(x)
PS: я использую groovy
, javascript
Сценарий или другой совместимый с java-скриптом движок будет следовать по тому же маршруту.