我正在尝试迁移/更新我的项目以使用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实现独立功能.
您可以使用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)
| 归档时间: |
|
| 查看次数: |
2428 次 |
| 最近记录: |