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

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

濮阳
2023-03-14

通过Java的Nashorn脚本引擎,我可以使用如下绑定在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是对象上的方法,而不是静态方法

共有1个答案

葛威
2023-03-14

可以使用对象。bindProperties是nashorn的扩展,用于将任意对象的属性绑定到JS全局对象。这样,用户就可以从脚本中调用“默认”对象上的方法(并访问属性),而无需进行限定。看物体。这里有bindProperties文档https://wiki.openjdk.java.net/display/Nashorn/Nashorn扩展#Nashornextensions对象。绑定属性

示例代码:

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)");
   }
}
 类似资料:
  • 我正试图使用Java8的全新Nashorn引擎,将JavaScript功能带到我的机器人平台上。以下是用于创建Nashorn脚本引擎实例的行: 在我自己的计算机上运行它可以正常工作,但是在部署平台上,生成的nashorn对象为null,并且无论何时使用它当然都会给出NullPointerException。经过一点调试,我们知道新的ScriptEngineering Manager()不是空的,但

  • 我正在尝试使用新的Java 8 Nashorn javascript引擎运行javascript脚本,但失败,出现以下错误: 脚本使用应在全局作用域中定义的readfull函数,nashorn在启用脚本模式的情况下运行(如图所示,在通过脚本引擎运行时,默认为启用脚本模式)http://mail.openjdk.java.net/pipermail/nashorn-dev/2013-December

  • 我们想在servlet中使用Nashorn。这个想法是使用ScriptEngine的单例实例,该实例在每次请求时都被重用。在每次请求时都会创建一个新的Engineering Scope绑定,并使用该绑定运行评估。然后清除绑定。没有共享对象被传递给绑定(只有servlet中的请求/响应对象)。 在servlet中,ScriptEngine的单例实例可能会在不同的线程中同时评估,这会正常工作还是会遇到

  • 设置全局默认样式,将会影响所有写入单元格的样式; 函数原型 defaultFormat(resource $formatHandler) resource $formatHandler $config = ['path' => './tests']; $excel = new \Vtiful\Kernel\Excel($config); ​ $excel->fileName('tutorial

  • 我有一个类实例,上面有一个字段。我在对象上设置了这个实例。我需要在Nashorn中设置字段,以便在Java中调用。我该如何在Nashorn脚本中设置此字段? 脚本是这样调用的: 在脚本中,我需要在全局对象上设置字段: 我已经看到了(建议重复)如何使用Nashorn引擎调用Java对象的问题,但这个问题是关于从Nashorn脚本调用Java方法,而这个问题是关于在Nashorn脚本中设置一个可调用的

  • 我想在groovy脚本中定义一个类,我可以通过SoapUI中的其他groovy脚本重用该类。 我一直试图在TestSuite属性中定义我的类,但没有成功。我希望避免在JAR中定义类,因为我们在团队中工作,每个人都必须在他们的SoapUI中导入JAR才能运行我的测试。我使用SoapUI 3.6.1 以下是我的TestSuite的制作方式: 为了简化me测试,我在“Test1”中定义了一个类,我想在“