Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JavaScript函数编译成可调用的Java对象?_Javascript_Java_Nashorn_Scriptengine_Javascript Engine - Fatal编程技术网

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

将JavaScript函数编译成可调用的Java对象?,javascript,java,nashorn,scriptengine,javascript-engine,Javascript,Java,Nashorn,Scriptengine,Javascript Engine,假设我得到了定义有效JavaScript函数的文本,如下所示: function sum(x, y) { return x + y } 我希望能够编写Java代码,将该文本编译成可调用实体,以便: 我的Java代码可以发现编译后的实体是一个函数,而不是任意脚本 我的Java代码可以发现函数有多少个参数 我可以通过为所有参数提供数据绑定从Java调用函数 我本来希望软件包能提供实现这一点的代码,但我一辈子都不知道该怎么做。我将如何编写Java代码来完成上述内容。要让Java调用该Ja

假设我得到了定义有效JavaScript函数的文本,如下所示:

function sum(x, y) {
    return x + y
}
我希望能够编写Java代码,将该文本编译成可调用实体,以便:

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

我本来希望软件包能提供实现这一点的代码,但我一辈子都不知道该怎么做。我将如何编写Java代码来完成上述内容。

要让Java调用该JavaScript函数,首先计算脚本,然后扫描全局范围内的变量以获取函数

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

Java8-14使用Nashorn引擎。下面是一个示例,其中包含定义函数的各种方法,因此您可以看到函数头中的差异

import java.util.Map.Entry;
导入javax.script.Bindings;
导入javax.script.ScriptEngine;
导入javax.script.ScriptEngineManager;
导入jdk.nashorn.api.scripting.JSObject;
String script=“函数和(x,y){\n”+
“返回x+y\n”+
“}\n”+
“函数diff(){\n”+
“返回参数[0]-参数[1]\n”+
“}\n”+
mult=函数(x,y){\n+
“返回x*y\n”+
“}\n”;
ScriptEngine=new ScriptEngineManager().getEngineByName(“js”);
Bindings vars=engine.createBindings();
engine.eval(脚本,变量);
for(条目变量:vars.entrySet()){
String name=var.getKey();
对象值=变量getValue();
if(JSObject的值instanceof){
JSObject jsObj=(JSObject)值;
if(jsObj.isFunction()){
字符串funcHeader=jsObj.toString().replaceFirst((?s)\\{.*,“”);
System.out.println(“函数”“+name+””定义为:“+funcHeader”);
System.out.println(name+“(5,7)=“+jsObj.call(null,5,7));
}
}
}
输出

函数“sum”定义为:函数sum(x,y)
总和(5,7)=12.0
函数“diff”定义为:函数diff()
差(5,7)=-2.0
函数“mult”定义为:函数(x,y)
mult(5,7)=35.0

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

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

Java8-14使用了Nashorn引擎。下面是一个例子,通过各种方式定义函数,因此您可以看到函数头中的差异

import java.util.Map.Entry;
导入javax.script.Bindings;
导入javax.script.ScriptEngine;
导入javax.script.ScriptEngineManager;
导入jdk.nashorn.api.scripting.JSObject;
String script=“函数和(x,y){\n”+
“返回x+y\n”+
“}\n”+
“函数diff(){\n”+
“返回参数[0]-参数[1]\n”+
“}\n”+
mult=函数(x,y){\n+
“返回x*y\n”+
“}\n”;
ScriptEngine=new ScriptEngineManager().getEngineByName(“js”);
Bindings vars=engine.createBindings();
engine.eval(脚本,变量);
for(条目变量:vars.entrySet()){
String name=var.getKey();
对象值=变量getValue();
if(JSObject的值instanceof){
JSObject jsObj=(JSObject)值;
if(jsObj.isFunction()){
字符串funcHeader=jsObj.toString().replaceFirst((?s)\\{.*,“”);
System.out.println(“函数”“+name+””定义为:“+funcHeader”);
System.out.println(name+“(5,7)=“+jsObj.call(null,5,7));
}
}
}
输出

函数“sum”定义为:函数sum(x,y)
总和(5,7)=12.0
函数“diff”定义为:函数diff()
差(5,7)=-2.0
函数“mult”定义为:函数(x,y)
mult(5,7)=35.0

isFunction()方法对于netscape.javascript.JSObject是未定义的。我使用Java11。@SKhandelwal
import
语句添加到应答中。isFunction()方法对于netscape.javascript.JSObject是未定义的。我使用Java11。@SKhandelwal
import
语句添加到应答中。