当前位置: 首页 > 知识库问答 >
问题:

在Nashorn脚本中对Java对象设置“Callable”

刘承运
2023-03-14

我有一个类实例,上面有一个Callable字段。我在绑定对象上设置了这个实例。我需要在Nashorn中设置Callable字段,以便在Java中调用。我该如何在Nashorn脚本中设置此字段?

脚本是这样调用的:

//in java
class Options {
    Callable<Boolean> handler;
}
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Bindings bindings = engine.createBindings();
Options options = new Options();
bindings.put("options", options);
engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
engine.eval(script);
Invocable executor = (Invocable) engine;
executor.invokeFunction("init");

在脚本中,我需要在全局选项对象上设置处理程序字段:

//in nashorn
function init() {
    //How would I set a Callable on this field, from within nashorn?
    options.handler = ?
}

我已经看到了(建议重复)如何使用Nashorn引擎调用Java对象的问题,但这个问题是关于从Nashorn脚本调用Java方法,而这个问题是关于在Nashorn脚本中设置一个可调用的,然后可以从Java调用它(基本上相反)。

共有1个答案

充子航
2023-03-14

基于本nashorn教程中的“扩展类”部分。测试过,对我有用:

   var Callable = Java.type('java.util.concurrent.Callable');
   var CallableImpl = Java.extend(Callable, {
     call: function() {
       print('test');
     }
   });
   
   options.handler = new CallableImpl();
 类似资料:
  • 通过Java的Nashorn脚本引擎,我可以使用如下绑定在eval()的上下文中提供对象: 我希望通过提供一个默认对象来简化javascript,这样javascript就不是: 我可以写: 有没有办法做到这一点?(someMethod是对象上的方法,而不是静态方法)

  • 在下面的代码中,javascript运行在与主线程不同的单独线程中。该脚本是一个无限循环,因此需要以某种方式终止。怎样 使命感脚本开始运行后,cancel()不起作用。但如果我打电话。cancel()在线程初始化之后,它将终止它(注释掉的行)。

  • 我在谷歌上研究了我的许多问题,但没有找到任何能提供直接答案的东西。我正在设置代码电子邮件一个表一次(或多次)。我无法设置收件人的电子邮件地址。我需要脚本为数据范围()中的每个地址发出一封电子邮件。 我很遗憾,由于隐私原因,我不能分享整个脚本。(从积极的方面来说,除了这个以外,其他的东西都起作用了。) 要获得“gmailapp.sendeMail”语句可用的一个(或多个)电子邮件地址,需要做什么?无

  • 问题内容: 编辑:为了将来参考,我正在使用非xhtml内容类型定义 我正在使用Django创建一个网站,并且试图在我的页面中嵌入任意json数据,以供客户端JavaScript代码使用。 假设我的json对象是。如果直接将其嵌入, 第一个关闭json对象。(此外,由于该json对象将动态生成,这将使站点容易受到XSS的攻击)。 如果使用django的HTML转义功能,则输出为: 并且浏览器无法解释

  • 出于安全原因,我想传递给Nashorn本地Java类型中的JS函数。 如果我创建了一个引擎并运行以下程序: 剧本是 输出是 我对第二个不太满意,我不知道getClass是否公开了java.lang.类对象的任何方法。有没有一种方法来传递将Java字符串包装在本机字符串中的东西,以扩展Nashorn自己的JSObject?

  • 我有课 在另一个类中,我从第一个类中获得了一个对象数组 现在我想写一个在第二个数组中查找名称的方法,并为该数组中第一个对象的实例分配一个新值 但我没有得到这个工作。我需要写点什么吗?在set()方法中? 谢谢=)