从宿主语言注入成员以到达客体语言作为客体语言类型

2024-02-23

这个问题与以下问题有些关系:GraalVM - 在没有上下文的情况下使用多语言值 https://stackoverflow.com/questions/51669154/graalvm-using-polyglot-value-without-a-context

在我的应用程序中,以客户语言运行的代码片段不需要知道注入的参数(通过绑定的成员)是 Java 参数。相反,对于使用客户语言进行开发的人来说,参数应该看起来只是客户语言本身的另一个参数。

例如,我希望将一个数组从我的 Java 主机语言注入到 JS 来宾脚本中,以这种方式:

Value guestLanguageBindings = context.getBindings(scriptData.getLanguage().toString());

guestLanguageBindings.putMember(argumentName, argumentValue);

以 JS 数组的形式“到达”客户语言,而不是像现在这样以 java.util.ArrayList 的形式。

目前,我通过将每个非原始类型(我注意到 String、int 等作为 JS“类型”到达 JS)转换为 JSON 并转换回客户语言来解决这个问题。

这是可行的,但我想知道是否有更合适的方法来做到这一点,或者使用绑定是否确实是正确的方法?

Thanks!


这是可行的,但我想知道是否有更合适的方法来做到这一点,或者使用绑定是否确实是正确的方法?

正如您所注意到的,当您将 Java 对象放入多语言语言中时,对于用户来说,它们看起来像 Java 对象,而不是 JavaScript 对象。为了使它们模仿访客语言对象,您可以使用 Polyglot Proxy API。

JS 对象示例(由 HashMap 支持):

try (Context context = Context.create("js")) {
    Map<String, Object> backingMap = new HashMap<>();
    backingMap.put("foo", "bar");
    context.getBindings("js").putMember("hostObject", ProxyObject.fromMap(backingMap));
    assert "bar".equals(context.eval("js", "hostObject.foo").asString());
    backingMap.put("foo", "baz");
    assert "baz".equals(context.eval("js", "hostObject.foo").asString());
}

JS 数组示例(由 Java 数组支持):

try (Context context = Context.create("js")) {
    Object[] backingArray = new Object[42];
    backingArray[0] = 42;
    context.getBindings("js").putMember("hostObject", ProxyArray.fromArray(backingArray));
    assert 42 == context.eval("js", "hostObject[0]").asInt();
    backingArray[0] = 43;
    assert 43 == context.eval("js", "hostObject[0]").asInt();
}

函数示例(由 Lambda 支持):

try (Context context = Context.create("js")) {
    ProxyExecutable executable = (arguments) -> arguments[0];
    context.getBindings("js").putMember("hostObject",executable);
    assert 42 == context.eval("js", "hostObject(42)").asInt();
    assert 43 == context.eval("js", "hostObject(43)").asInt();
}

您还可以直接实现 ProxyObject 和 ProxyArray 来自定义行为,例如如果您想提供只读对象或数组。

这是另一个代理示例:http://www.graalvm.org/docs/graalvm-as-a-platform/embed/#compulated-arrays-using-polyglot-proxies http://www.graalvm.org/docs/graalvm-as-a-platform/embed/#computed-arrays-using-polyglot-proxies

代理Javadoc:http://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/proxy/package-summary.html http://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/proxy/package-summary.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从宿主语言注入成员以到达客体语言作为客体语言类型 的相关文章

随机推荐

  • 在 Woocommerce 中仅显示特定客户所在国家/地区的价格

    我已经使用 woocommerce 开发了一个目录 但是我需要能够对从英国境外访问该网站的用户隐藏产品价格由于我无法控制的原因 我找到了一些插件 可以让我根据访问者位置更改产品价格 但没有任何插件可以让我隐藏价格 是否有任何我错过的插件或任
  • GlobalFilter 与 WebFilter

    我正在 Spring Cloud Gateway 中迈出第一步 在学习过程中 我想更好地了解GlobalFilter 具体来说 我打算每次都应用一些过滤器every route 阅读文档 参考 https cloud spring io s
  • 当表单具有背景图像时,如何解决控件不必要的闪烁?

    问题概述 当我尝试隐藏一些标签 文本框和按钮时 我遇到了这个问题 所有这些控件在隐藏时都会闪烁 但其他不涉及的控件都很好 我不想要这种效果 另外 这不会发生在Show 仅发生在Hide 我尝试过的 删除背景图像解决了这个问题 但我确实希望我
  • 在 iOS 8 上使用 NSKeyedUnarchiver 取消存档 UIImage 对象返回 CGSizeZero 图像

    我的代码在 iOS 7 上运行 NSData imageData NSKeyedArchiver archivedDataWithRootObject self imageView image UIImage imageCopy NSKey
  • 如何在 PHP 8.0 中使用 ssh2?

    在安装 php 8 更新之前 我通读了所有不兼容性 只是发现为时已晚 我还没有找到对 ssh2 扩展的支持 我希望我只是错过了一些东西 我已经用谷歌搜索了几个小时 所有可能的线索都没有找到 谁能告诉我 ssh2 扩展的 php 8 版本吗
  • Spring在单元测试中嵌入了ldap服务器

    我目前正在尝试使用嵌入式 LDAP 服务器进行单元测试 在 Spring Security 中 您可以快速定义一个嵌入式 ldap 服务器 以便使用标签以及从指定 ldif 加载的一些示例数据进行测试 我将使用 Spring Ldap 执行
  • 致命错误,因为传递的是 Error 实例而不是预期的 Exception 实例

    我刚刚安装了 xampp 和 php 7 0 4 以及新的 cakephp 3 2 6 我做了很多研究 我发现的一切都表明它们是兼容的 然而 当我用浏览器打开应用程序时 蛋糕就会回复内部错误 关于要做什么的唯一指示是 xampp 在 apa
  • 获取当前背景

    我想获取当前的背景并以此为基础做一个条件 例如 我有一个带有下一个箭头的xml 如果背景 R drawable A 我想在按下下一个按钮时将背景更改为R drawable B 我定义了我的相对布局如下 final RelativeLayou
  • python中a=b=c是什么? [复制]

    这个问题在这里已经有答案了 我很困惑 连续相等 可以在 python 中使用 例如 a b c 这个语言特性叫什么 有什么我可以读到的吗 能化成4个等号吗 a b c d 这只是一种声明方式a and b等于c gt gt gt c 2 g
  • 重写 editTextStyle 不适用于最新的材质组件基本样式

    在我的应用程序中 我使用Theme MaterialComponents Light NoActionBar作为基本样式 这种风格 我称之为AppTheme 我正在尝试覆盖editTextStyle提供自定义样式com google and
  • R 中的四参数 beta 分布

    R 中是否有内置函数可以计算四参数 beta 分布 即 具有两个形状参数和两个边界参数的分布 因此它不受 0 1 的限制 我自己做了一个 但很好奇这个功能是否已经存在 无需重新发明轮子 shp1 lt 20 shp2 lt 5 X lt s
  • Pandas/Python 根据条件添加行

    我希望根据某些条件在两个现有行之间的数据框中插入一行 例如 我的数据框 import pandas as pd df pd DataFrame Col1 A B D E Col2 B C E F Col3 1 1 1 1 看起来像 Col1
  • 高流量 Web 应用程序的最佳扩展方法?

    我们有一个新的网络应用程序项目 它将在网站 作为网络 上显示横幅广告 我们估计它每月可以处理 20 到 400 亿次展示 我们当前的语言是 ASP 但正在转向 PHP PHP 5 在扩展 Web 应用程序方面有限制吗 或者 我应该让我们的团
  • prolog 中递归的停止条件

    以下是我的知识库中的事实 http www doc gold ac uk mas02gw prolog教程 prolog页面 recursion html http www doc gold ac uk mas02gw prolog tut
  • 安卓蓝牙错误133

    我正在尝试连接到 Android 上的蓝牙设备 我的状态收到 133onClientConnectionState处理程序 我并不总是收到此错误 有时它连接正常 我无法确定是什么触发了这个问题 我什至在重新启动设备和我的重现应用程序后立即获
  • 将自定义类添加到在 Woocommerce 中显示“缺货”的变体选项

    我在用着 https stackoverflow com questions 47180058 how to add variation stock status to woocommerce product variation dropd
  • R's Match 的 Julia 版本?

    来自 R 的帮助页面match 描述 match 返回其 第一个 匹配项的位置向量 第一个参数在第二个参数中 也就是说 我可以给出两个向量 match v1 v2 返回一个向量 其中第 i 个元素是索引 其中v1 i 出现在v2 Julia
  • Google Apps 脚本是否支持私有类属性?

    我尝试使用私人课程特色 https developer mozilla org en US docs Web JavaScript Reference Classes Private class fields在 Google Apps 脚本
  • 在 Junit4 (PowerMock) 中实现模拟时的依赖关系

    下面是我的 JUnit 测试用例 import static org junit Assert assertEquals import static org junit Assert assertNull import static org
  • 从宿主语言注入成员以到达客体语言作为客体语言类型

    这个问题与以下问题有些关系 GraalVM 在没有上下文的情况下使用多语言值 https stackoverflow com questions 51669154 graalvm using polyglot value without a