【问题标题】:Nashorn: Call function inside of a namespaceNashorn:在命名空间内调用函数
【发布时间】:2016-01-10 00:46:20
【问题描述】:

我已经使用NashornScriptEngine 评估了以下脚本:

var Namespace = {
    test: function()
    {
        return "It works";
    }
}

现在我想调用函数test

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

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

如何调用这个函数?

【问题讨论】:

  • 你能把java源代码也包括进来吗?

标签: javascript java namespaces nashorn


【解决方案1】:

您正在尝试访问名为 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 我不是 100% 确定,但以下代码是安全的 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("nashorn"); Invocable inv = (Invocable) engine; inv.invokeFunction("hello", "Scripting!"); 如果您还有其他问题,请提出单独的问题,以便对 SO 的其他用户有用
  • 如果您能包含整个解决方案,那就太好了。如果 javascript 代码 (var Namespace={....}) 在一个名为 say js 的字符串中,那么如果您使用的是“engine.eval(js)”或“engine.eval(reader)”,则必须执行文件阅读器。我看不到如何评估字符串文字“JSON”或“命名空间”,因为这不是 javascript 代码。参考文档中没有真正解释上下文,也没有找到任何有用的描述来说明它们是什么以及如何使用它们
  • @johnlittle 我提供的示例有效。 JSON 是一个内置的命名空间,它是一个有效的 JS 引用。我正在向您展示如何调用它的 parseString 方法。如果 OP 已经创建了一个名为 Namespace 的全局,通过之前对其进行评估,您也可以从同一个引擎访问它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2011-01-11
  • 2011-05-25
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多