gpt4 book ai didi

java - Nashorn 脚本引擎。如何将 "org"对象从全局范围共享到局部范围?

转载 作者:行者123 更新时间:2023-11-30 03:21:59 25 4
gpt4 key购买 nike

Nashorn 脚本引擎不共享从全局范围到引擎范围的“com”和“org”对象/命名空间。因为“com”和“org”是引擎提供的Java包。

在示例中,我将 aorg 变量放入 engine2 的全局范围。

  • a = 3 已共享
  • org = 10 存在于 GLOBAL_SCOPE 中,但未共享到 ENGINE_SCOPE

代码:

public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
Bindings bindings = engine.createBindings();
bindings.put("a", 3);
bindings.put("org", 10);
log("bingings-org", bindings.get("org"));
manager.setBindings(bindings);

ScriptEngine engine2 = manager.getEngineByName("JavaScript");
log("global-a", engine2.getBindings(ScriptContext.GLOBAL_SCOPE).get("a"));
log("local-a", engine2.get("a"));
log("global-org", engine2.getBindings(ScriptContext.GLOBAL_SCOPE).get("org"));
log("local-org", engine2.get("org"));
}
  1. 有没有办法将“org”和“com”包从全局范围共享到本地范围?
  2. 是否存在描述情况的文档?

最佳答案

搜索脚本全局变量时,搜索顺序是先ENGINE_SCOPE,然后GLOBAL_SCOPE。 Nashorn 引擎的 ENGINE_SCOPE 绑定(bind)是包装为 javax.script.Bindings 对象的 ECMAScript“全局”对象。正如您所观察到的,ENGINE_SCOPE 具有“org”、“com”等的映射 - 它们是 Java 包前缀对象。因此,这些将从 GLOBAL_SCOPE 绑定(bind)中隐藏任何“org”、“com”等。两种解决方案:

  1. 您有向脚本公开的“上下文”变量。因此,您可以使用相同的方法来获取 GLOBAL_SCOPE 映射。

    private static void log(String msg, Object obj) {
    System.out.println(msg + " " + obj);
    }

    public static void main(String[] args) throws ScriptException {
    ScriptEngineManager manager = new ScriptEngineManager();
    Bindings bindings = new SimpleBindings();
    bindings.put("a", 3);
    bindings.put("org", 10);
    log("bingings-org", bindings.get("org"));
    manager.setBindings(bindings);

    ScriptEngine engine = manager.getEngineByName("JavaScript");
    log("global-a", engine.getBindings(ScriptContext.GLOBAL_SCOPE).get("a"));
    log("local-a", engine.get("a"));
    log("global-org", engine.getBindings(ScriptContext.GLOBAL_SCOPE).get("org"));
    log("local-org", engine.get("org"));

    // Use "context" to access GLOBAL_SCOPE "org" from script
    engine.eval(
    "var GLOBAL_SCOPE = javax.script.ScriptContext.GLOBAL_SCOPE;\n" +
    "var g = context.getBindings(GLOBAL_SCOPE);\n" +
    "print(g.get('org'))");
    }
  2. 您可以删除 ENGINE_SCOPE 绑定(bind)中的“org”、“com”等。

    private static void log(String msg, Object obj) {
    System.out.println(msg + " " + obj);
    }

    public static void main(String[] args) throws ScriptException {
    ScriptEngineManager manager = new ScriptEngineManager();
    Bindings bindings = new SimpleBindings();
    bindings.put("a", 3);
    bindings.put("org", 10);
    log("bingings-org", bindings.get("org"));
    manager.setBindings(bindings);

    ScriptEngine engine = manager.getEngineByName("JavaScript");
    log("global-a", engine.getBindings(ScriptContext.GLOBAL_SCOPE).get("a"));
    log("local-a", engine.get("a"));
    log("global-org", engine.getBindings(ScriptContext.GLOBAL_SCOPE).get("org"));
    log("local-org", engine.get("org"));
    // "org" in ENGINE_SCOPE hides GLOBAL_SCOPE "org".
    // delete the "org" in ENGINE_SCOPE
    // you could delete "org" from Java code as well using
    // "remove" method of Bindings object
    engine.eval("delete org");
    System.out.println("after deleting ENGINE_SCOPE org");
    log("local-org", engine.get("org"));
    }

关于java - Nashorn 脚本引擎。如何将 "org"对象从全局范围共享到局部范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31130462/

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