gpt4 book ai didi

javascript - 将 JavaScript 函数编译成可调用的 Java 对象?

转载 作者:行者123 更新时间:2023-12-01 02:29:09 26 4
gpt4 key购买 nike

假设我已经定义了一个有效的 JavaScript 函数的文本,如下所示:

function sum(x, y) {
return x + y
}

我希望能够编写 Java 代码,将该文本编译为可调用实体,以便:

  • 我的 Java 代码可以发现编译的实体是一个函数,而不是任意脚本。
  • 我的 Java 代码可以发现函数有多少个参数
  • 我可以通过为所有参数提供数据绑定(bind)来从 Java 调用该函数。

我期待 javax.script包来提供可以完成此任务的代码,但我一生都不知道如何实现。我将如何编写 Java 代码来完成我上面描述的任务。

最佳答案

要让 Java 调用该 JavaScript 函数,您首先要评估该脚本,然后扫描全局范围内的变量以查找函数。

您可以调用这些函数,但无法获取参数。为此,您必须自己解析函数头。

Java 8-14 使用 Nashorn 引擎。这里是一个例子,有多种方法来定义函数,所以你可以在函数头中看到差异。

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));
}
}
}

输出

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

关于javascript - 将 JavaScript 函数编译成可调用的 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48454478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com