java - 如何从 java 将 Java 类型添加到 nashorn 引擎全局作用域?

标签 java java-8 nashorn

基本上我希望获得与调用相同的效果:

ScriptEngineManager::put(String key, Object value)

但对于 Java 类型。类似于:

ScriptEngineManager::put(String key, Class<?> clazz)

例如,在调用后:

scriptEngineManager.put("MyClass", MyClass.class)

我将能够做到:

ScriptEngine engine = scriptEngineManager.getEngineByName("nashorn");
engine.eval("MyClass.myStaticMethod();")

可能吗?

谢谢!

最佳答案

是的,可以调用 Java 静态 方法。也许有更简单的方法,但我想出了以下方法。

假设您有 2 个 Java 类 AdderArithm:

public class JSNashorn {

    public static class Adder {
        int total=0;
        public Adder() {}
        public int add(int x) { return total+=x;}
        public int getTotal() { return total;}
    }

    public static class Arithm {
        public static int sum(int a, int b) {
            return a+b;
        }
        public static int mul(int a, int b) {
            return a*b;
        }
    }
    //...
}

初始化JS引擎:

    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine jsEngine = factory.getEngineByName("nashorn");
    Invocable iv = (Invocable)jsEngine;

为了在实例上调用 Java 方法:

    jsEngine.eval("function makeJsObject(nativeObject) { return {nativeObject:nativeObject}; };");

    Object adder = iv.invokeFunction("makeJsObject", new Adder());
    jsEngine.put("adder", adder);
    jsEngine.eval("adder.add = function(x) { return this.nativeObject.add(x); };");
    System.out.println("add: "+iv.invokeMethod(adder, "add", 67));
    System.out.println("add: "+iv.invokeMethod(adder, "add", 33));

此打印:

add: 67
add: 100

现在对于静态方法:

    jsEngine.eval("function makeJsClass(nativeClass) { return Java.type(nativeClass); };");

    Object arithm = iv.invokeFunction("makeJsClass", "JSNashorn$Arithm");
    jsEngine.put("arithm", arithm);
    jsEngine.eval("sum = function(x,y) { return arithm.sum(x,y); };");
    jsEngine.eval("mul = function(x,y) { return arithm.mul(x,y); };");
    System.out.println("sum: "+iv.invokeFunction("sum", 100, -2));
    System.out.println("mul: "+iv.invokeFunction("mul", 100, -2));

此打印:

sum: 98
mul: -200

关于java - 如何从 java 将 Java 类型添加到 nashorn 引擎全局作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28860068/

相关文章:

java - 有没有一种方法可以使用方法引用进行降序排序?

java.net.SocketException : Connection reset in spring Rest template

javascript - 使用 Nashorn 在 Java 中运行具有导出功能的 Javascript 代码

java - 如何从 Javascript (Java 1.8) 访问 Java 枚举

java - 将 Swing 组合框提示工具设置为所选项目

java - 使用 Morphia 查询映射键、值

java - 将JAR游戏嵌入Wordpress网站

java - 从数据库中检索数据而不刷新页面

java - 为什么永远不会到达collect方法中的BiConsumer Combiner代码?

java - Nashorn NativeDate 转换为 java.util.Date