gpt4 book ai didi

java - 无法使用 Nashorn 在 Java List 上调用 hasOwnProperty

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:11:48 24 4
gpt4 key购买 nike

我有一个执行大量 javascript 服务器端的应用程序,我正在尝试从 Rhino 转换为 Nashorn,但我的脚本遇到了麻烦。使用 Rhino,我总是会将函数的任何参数转换为 JSON 字符串,但这真的很慢。对于 Nashorn,我试图将参数作为 Java 对象传递,但它们似乎没有从 Javascript 的 Object 类型继承函数。这是一个示例方法,它说明了 hasOwnProperty 在我的阵列上不可用的问题:

public String printArrayValues() throws ScriptException, NoSuchMethodException {

String script =
"function printArrayValues(objArray) {\n" +
" var result = '';\n" +
" for(var obj in objArray) {\n" +
" if(objArray.hasOwnProperty(obj)) {\n" +
" result = result + ' ' + objArray[obj];\n" +
" }\n" +
" }\n" +
" return result;\n" +
"}";

List<String> data = Arrays.asList(new String[]{ "one", "two", "three"});

ScriptEngine scriptEngine = new NashornScriptEngineFactory().getScriptEngine();
scriptEngine.eval(script);
String result = (String) ((Invocable) scriptEngine).invokeFunction("printArrayValues", data);
}

这里对 invokeFunction 的调用抛出异常:

javax.script.ScriptException: TypeError: [one, two, three] has no such function "hasOwnProperty" in <eval> at line number 4

如果我在浏览器中调用相同的函数,我会得到我期望的结果:

> printArrayValues(["one", "two", "three"]);
> " one two three"

有没有什么方法可以实现这一点,这样我就可以真正使用这些 Java 对象,而无需将它们转换为 JSON 字符串,然后将其评估为 Javascript 对象?

最佳答案

您不能以这种方式使用 Java 数组。 Java 数组是“硬连线”对象。与普通对象不同,它们没有方法,并且支持 [] 运算符,而对象不能。

Article about Nashorn at Oracle说明您需要在 javascript 中使用 Java.toJava.from 方法才能将 Java 数组更改为 Javascript 数组。

关于java - 无法使用 Nashorn 在 Java List 上调用 hasOwnProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26895632/

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