gpt4 book ai didi

nashorn - 将 Java 实现的函数添加到 Nashorn 的全局作用域中

转载 作者:行者123 更新时间:2023-12-03 02:44:07 30 4
gpt4 key购买 nike

我正在尝试迁移/更新我的项目以使用 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) {
...
}
}

其实例已添加到目标范围中。如果出现 Nashorn 该怎么办?我找不到Nashorn如何实现独立功能。

最佳答案

您可以轻松地用Java实现脚本功能。您只需使用 lambda 实现任何 @FunctionalInterface ( https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html ) 接口(interface),并通过调用 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())");
}
}

关于nashorn - 将 Java 实现的函数添加到 Nashorn 的全局作用域中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289217/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com