如何从java添加Java类型到nashorn引擎全局范围?

时间:2015-03-04 16:45:50

标签: 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();")

有可能吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

是的,可以调用Java static方法。也许有一种更简单的方法,但我想出了以下内容。

假设您有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

现在适用于static方法:

    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