To have Java call that JavaScript function, you first evaluate the script, then scan the variables in the global scope for functions.
You can call those functions, but you don't get the parameters. For that, you'd have to parse the function header yourself.
Java 8-14 uses the Nashorn engine. Here is example, with various ways to define a function, so you can see the difference in the function header.
import java.util.Map.Entry;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import jdk.nashorn.api.scripting.JSObject;
String script = "function sum(x, y) {\n" +
" return x + y\n" +
"}\n" +
"function diff() {\n" +
" return arguments[0] - arguments[1]\n" +
"}\n" +
"mult = function(x, y) {\n" +
" return x * y\n" +
"}\n";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
Bindings vars = engine.createBindings();
engine.eval(script, vars);
for (Entry<String, Object> var : vars.entrySet()) {
String name = var.getKey();
Object value = var.getValue();
if (value instanceof JSObject) {
JSObject jsObj = (JSObject) value;
if (jsObj.isFunction()) {
String funcHeader = jsObj.toString().replaceFirst("(?s)\\{.*", "");
System.out.println("function '" + name + "' defined as: " + funcHeader);
System.out.println(name + "(5,7) = " + jsObj.call(null, 5, 7));
}
}
}
Output
function 'sum' defined as: function sum(x, y)
sum(5,7) = 12.0
function 'diff' defined as: function diff()
diff(5,7) = -2.0
function 'mult' defined as: function(x, y)
mult(5,7) = 35.0