【问题标题】:How To Initialize Nashorn Context and engine directly?如何直接初始化 Nashorn 上下文和引擎?
【发布时间】:2016-03-04 18:55:44
【问题描述】:

我正在尝试直接从 jdk.nashorn.* 命名空间初始化 Oracle 的 javascript nashorn 引擎。 (nashorn 库是 2013 Jan 的测试版)。

有一个 web 示例调用引擎的 Nashorn 引擎实例,使用 javax.script.ScriptEngineManager 实用程序类。

var engine = ScriptEngineManager.getEngineByName(*)

但是,我喜欢远离 ScriptEngineManager,所以我需要像 Rhino 一样直接调用引擎。

Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects();

如何直接创建 nashorn 引擎实例?

【问题讨论】:

  • 是的,我们可以在 javadoc 中看到“NashornScriptEngine”,但看起来您只能通过使用 ">java -cp nashorn.jar:.EvalFile 运行 Eval 类来获取引擎。 js
  • 感谢您的评论。马塞洛我正在尝试使用 .net 中的 nashorn。 API ScriptEngineManager.getEngineByName('nashorn') 在 .NET 中返回 null。这可能是 jvm 和 IKVM 的问题,因为 nashorn 使用了与 .NET 不同的最新 JVM API dynamicinvoke。
  • 在 Java 中,如果 "ScriptEngineManager.getEngineByName('nashorn')" 返回 null,则 nashorn.jar 不在类路径中。不知道你需要在 .NET 中做什么来解决这个问题。

标签: javascript nashorn


【解决方案1】:

javax script engine by type application/javascript Hashorn,取回一个脚本引擎并告诉它做事,它还提供可调用和可编译的接口。

您可能有兴趣阅读此内容:How can I start coding with Oracle's Nashorn JS Engine and when will it replace Rhino in the OpenJDK?

示例用法:

import javax.*; //lib imports
// we should use the javax.script API for Nahsorn
ScriptEngineManager m = new ScripteEngineManager(); 
ScriptEngine e = m.getEngineByname("nashorn");
try {
   e.eval("print('hello nashorn !')");
} catch(Exception e) {
  // using jdk lower then version 8 maybe ?
}

【讨论】:

【解决方案2】:

我找到了直接使用 .NET 初始化引擎的方法,而无需“

    "javax.script.ScriptEngineManager"

环境: IKVM.NET 版本 8 + .NET Framework 4.52

    static void Main(string[] args)
    {

        jdk.nashorn.api.scripting.NashornScriptEngineFactory fact = new jdk.nashorn.api.scripting.NashornScriptEngineFactory();
        jdk.nashorn.api.scripting.NashornScriptEngine nashornengine = fact.getScriptEngine() as jdk.nashorn.api.scripting.NashornScriptEngine;

        nashornengine.eval("var x = 1/3;");
        object result = nashornengine.get("x");
        Console.WriteLine("{0}", result);
    }

这让我可以更直接地与 nashorn 上下文方法进行交互。

 compile()
 getFactory()
 invokeMethod()
 invokeFunction()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多