Класс Context
имеет несколько отличных вариантов для этого. Вот пример, где я использовал два различных метода для выполнения sh для создания функции.
public static void main(String[] args){
String funCode = "function(arg){ print(arg);}";
String funName = "checkPlease";
String objCode = "x = { one : 1, two : \"two\"};";
Context context = Context.enter();
Scriptable scope = context.initStandardObjects();
context.evaluateString(scope, "function print( arg ){Packages.java.lang.System.out.println( arg );};", null, 1, null);
context.evaluateString(scope, "print(\"to here\")", null, 1, null);
Function fun = context.compileFunction( scope, funCode, funName, 1, null);
Script s = context.compileString(objCode, "NA", 1, null);
Object obj = s.exec(context, scope);
fun.call(context, scope, fun, new Object[]{ obj});
HashMap<String, String> map = new HashMap<>();
map.put("this", "that");
fun.call(context, scope, fun, new Object[]{ context.javaToJS(map, scope) });
}
Поскольку print
не входил в мою область, я просто создал функцию, используя строку оценки. Я также создал функцию, используя compileFunction. Я вызвал функцию и передал аргумент тремя разными способами. А) просто вызывая функцию javascript из javascript. Б) Компиляция строки и передача ее в качестве аргумента, C) с использованием context.javaTo JS. Это выход.
здесь
[объект объекта]
{this = that}