Refer to existing Java objects from JavaScript using nashorn

ka3ak :

I know that I can create Java objects and call methods on them using the code like:

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

But is it possible to call methods on already existing Java objects using nashorn?

David P. Caldwell :

Yes. Use ScriptEngineManager.getBindings().put(String name, Object value) to put existing objects in the engine scope.

Example:

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();"
        );
    }
}

Result:

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=134131&siteId=1