gpt4 book ai didi

java - 为 Nashorn 脚本引擎定义默认/全局 Java 对象?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:08:29 43 4
gpt4 key购买 nike

借助 Java 的 Nashorn 脚本引擎,我可以使用如下绑定(bind)在 eval() 的上下文中提供对象:

Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("rules", myObj);
scriptEngine.eval("rules.someMethod('Hello')", scriptContext);

我希望能够通过提供默认对象来简化 javascript,这样 javascript 就不是:

rules.someMethod('Hello')

我可以写:

someMethod('Hello')

有什么办法可以实现吗? (someMethod 是对象上的方法,不是静态方法)

最佳答案

您可以使用 nashorn 的 Object.bindProperties 扩展将任意对象的属性绑定(bind)到 JS 全局对象。这样用户就可以从脚本中调用您的“默认”对象的方法(和访问属性)而无需限定。请在此处查看 Object.bindProperties 文档 https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-Object.bindProperties

示例代码:

import javax.script.*;

public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");

// get JavaScript "global" object
Object global = e.eval("this");
// get JS "Object" constructor object
Object jsObject = e.eval("Object");

Invocable invocable = (Invocable)e;

// calling Object.bindProperties(global, "hello");
// which will "bind" properties of "hello" String object
// to JS global object
invocable.invokeMethod(jsObject, "bindProperties", global, "hello");

// you're calling "hello".toUpperCase()"
e.eval("print(toUpperCase())");
// accessing bean property "empty" on 'hello' object
e.eval("print(empty)");

// just print all (enumerable) properties of global
// you'll see methods, properties of String class
// (which'd be called on "hello" instance when accessed)
e.eval("for (var i in this) print(i)");
}
}

关于java - 为 Nashorn 脚本引擎定义默认/全局 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31236550/

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