Nashorn:在命名空间中调用函数

5
我使用 NashornScriptEngine 评估了以下脚本:
var Namespace = {
    test: function()
    {
        return "It works";
    }
}

现在我想调用函数test

使用nashorn引擎的invokeFunction方法时,会抛出以下异常:

java.lang.NoSuchMethodException: No such function Namespace.test

这个函数怎么调用呢?

你能同时包含Java源代码吗? - John Little
1个回答

5
您正在尝试访问名为window["Namespace.test"]的全局函数,而不是window.Namespace.Test。您首先需要获取对Namespace的引用,然后可以调用invocable.invokeMethod,将Namespace指定为其上下文(this)。
例如,要调用JSON.parse(),可以使用以下代码:
Object json = engine.eval("JSON"); // Or "Namespace" in your case
Object data = invocable.invokeMethod(json, "parse", contactJson); //"test" for the case you mention

谢谢,这解决了问题。顺便问一下,从你的变量命名来看,我猜你在一个Invocable对象上调用了invokeMethod方法。将engineManager.getEngineByName("nashorn")强制转换为NashornScriptEngine总是安全的吗? - Ercksen
1
@Ercksen 我不是100%确定,但以下代码是安全的:ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("nashorn"); Invocable inv = (Invocable) engine; inv.invokeFunction("hello", "Scripting!"); 如果您有更多问题,请提出单独的问题,以便其他SO用户受益。 - Ruan Mendes
如果您能包含整个解决方案,那就太好了。如果JavaScript代码(var Namespace = {...})在名为js的字符串中,则必须执行"engine.eval(js)"或"engine.eval(reader)"(如果您正在使用文件读取器)。我不知道如何评估字符串文字“JSON”或“Namespace”,因为这不是JavaScript代码。上下文在参考文档中没有得到很好的解释,也没有找到任何有用的描述它们是什么以及如何使用它们。 - John Little
@johnlittle 我提供的示例是有效的。JSON是一个内置命名空间,它是一个有效的JS引用。我正在向您展示如何调用其parseString方法。如果OP之前通过eval创建了一个名为Namespace的全局变量,您也可以从同一引擎中访问它。 - Ruan Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接