使用 nashorn 从 Java 脚本引用现有 Java 个对象

Refer to existing Java objects from JavaScript using nashorn

我知道我可以使用如下代码创建 Java 对象并调用它们的方法:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
            engine.eval("var SomeJavaClass = " + "Java.type('somepackage.SomeJavaClass');" +
"var x = new SomeJavaClass();" +
"x.doSomething();"

但是是否可以使用 nashorn 在已经存在的 Java 对象上调用方法?

是的。使用 ScriptEngineManager.getBindings().put(String name, Object value) 将现有对象放入引擎范围。

示例:

import javax.script.*;

public class NashornVariables {
    public static class SomeJavaClass {
        public void doSomething() {
            System.out.println("I did something!");
        }
    }

    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        manager.getBindings().put("x", new SomeJavaClass());
        ScriptEngine engine = manager.getEngineByName("nashorn");
        engine.eval(
            "x.doSomething();"
        );
    }
}

结果:

$ javac NashornVariables.java; java NashornVariables
I did something!