Поместите класс java в глобальную область видимости Nashorn - PullRequest
0 голосов
/ 23 апреля 2020

Я использую Nashorn в песочнице следующим образом:

ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(
            new String[]{"--no-java", "--no-syntax-extensions", "--optimistic-types=true", "--language=es6"},
            null);

Но я хочу использовать один конкретный класс в моем javascript. Как это сделать? Например, у меня есть класс:

class MyClass
{
    public void m1()
    {
        System.out.println("This is m1");
    }
    public void m2()
    {
        System.out.println("This is m2");
    }
}

И я хочу использовать его в сценарии как

let a=new MyClass();
a.m1();
a.m2();

Как это сделать? Спасибо

1 Ответ

0 голосов
/ 23 апреля 2020

вы можете использовать Bindings для предоставления java объектов ScriptEngine:

import jdk.nashorn.api.scripting.NashornScriptEngineFactory;

import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptException;


public class MyClass {
    public static void main(String[] args) {

     ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(
            new String[]{"--no-java", "--no-syntax-extensions", "--optimistic-types=true", "--language=es6"},
            null);

    Bindings bindings = engine.createBindings();
    bindings.put("myclass", new MyClass());
    engine.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);

    String code = "myclass.m1();";

    try {
        engine.eval(code, bindings);
    } catch (ScriptException e) {
        e.printStackTrace();
    }
    }

    public void m1() {
        System.out.println("This is m1");
    }

    public void m2(String str) {
        System.out.println("This is m2 " + str);
    }

    public void m3(Class claz) {
        System.out.println(claz);
    }

}

или если действительно нужно создать экземпляр MyClass в коде JS, который вы могли бы сделать (работает с Java> = 9) :

    Bindings bindings = engine.createBindings();
    bindings.put("myclass", StaticClass.forClass(MyClass.class));

    var code = "var a = new myclass(); a.m1();";

    try {
        engine.eval(code, bindings);
    } catch (ScriptException e) {
        e.printStackTrace();
    }
...