gpt4 book ai didi

javascript - 将全局函数/变量添加到 GraalVM JavaScript 引擎

转载 作者:行者123 更新时间:2023-12-05 04:30:39 25 4
gpt4 key购买 nike

如何通过 Object.bindProperties() 方法使用 Nashorn 兼容模式向 GraalVM 的 JavaScript 'this' 对象添加自定义全局函数(参见:Defining a default/global Java object to Nashorn script engine?)?我找不到使用 Context 方法的方法,并且 Context 对象的反射没有显示我可以使用的类似 bindProperties() 方法。

例子:

我有这些方法:

class GlobalMethods
{
public void a() {...}
public void b() {...}
public void c() {...}
}

并且我希望 a()、b() 和 c() 可以在没有范围/限定的情况下在 JavaScript 中调用:

context.eval("js", "a()");

提前致谢!

最佳答案

对于 js 函数,您可以定义一个文件,例如 globals.js,其中初始化全局变量并将其添加到 JavaScript 全局对象中:

globalThis.someFunction = function() {...}

并设置选项 js.commonjs-global-properties在上下文创建时加载此文件:

Context context = Context.newBuilder("js")
.option("js.commonjs-global-properties", "./globals.js")
.build();

为了将 java 选项绑定(bind)到 JS,您需要通过 Bindings 启用 polyglot.js.allowHostAccess :

Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("polyglot.js.allowHostAccess", true);
bindings.put("polyglot.js.allowHostClassLookup", (Predicate<String>) s -> true);
bindings.put("javaObj", new Object());

或上下文:

Context context = Context.newBuilder("js")
.allowHostAccess(true)
.build();

context.getBindings("js").putMember("a", GlobalMethods.a);

或者您可以使用 @HostAccess.Export类定义中的装饰器:

  @HostAccess.Export
public void a() {...}

虽然我不确定您是否可以在至少一次不引用类名的情况下访问像 GlobalMethods.a() 这样的静态方法,也许直接传递函数输出足以满足您的需求,或传递类定义,然后是 eval globalThis.a = GlobalMethods.a(未测试)。

关于javascript - 将全局函数/变量添加到 GraalVM JavaScript 引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71989259/

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