将Java实现的函数添加到Nashorn的全局范围中

Xtr*_*der 3 nashorn

我正在尝试迁移/更新我的项目以使用Rhino的Nashorn.我有一些用Java实现的全局实用程序函数,并添加到目标脚本引擎的全局范围内,典型的例子是log(message).

在Rhino中,它是通过实现的

public static class LogFunction extends org.mozilla.javascript.BaseFunction {
    @Override
    public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

其实例添加到目标范围.在Nashorn的情况下需要做些什么?我找不到如何为Nashorn实现独立功能.

A. *_*jan 5

您可以使用Java轻松实现脚本函数.您只需使用lambda 实现任何@FunctionalInterface(https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html)接口,并通过调用ScriptEngine.put将其作为全局变量公开. (https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngine.html#put-java.lang.String-java.lang.Object-)方法.以下示例实现了两个在Java代码中实现的脚本"函数".

import javax.script.*;
import java.util.function.*;
import java.util.Random;

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

     // expose 'log' function - any @FunctionInterface Java
     // object can be exposed as 'function'
     e.put("log", (Consumer<String>)System.out::println);

     Random r = new Random();
     // expose 'next gaussian' as script global function
     e.put("gaussian", (Supplier<Double>)r::nextGaussian);

     // call functions implemented in Java!
     e.eval("log('hello')");
     e.eval("print(gaussian())");
     e.eval("print(gaussian())");
  }
}
Run Code Online (Sandbox Code Playgroud)