JS引擎

  在javax.script包下提供有关脚本引擎的类和接口,为我们定义了一系列的规范,达到可以在java应用程序中执行脚本语言编写的程序。

  javax.script包的主要功能有:

    1.脚本执行:执行脚本文件中的程序,使用ScriptEngine的eval方法和Invocable接口的方法。

    2.绑定:将java对象作为指定变量公开给脚本程序。相当于为脚本设置全局变量之类的。Bingdings和ScriptContext类用于此目的。

    3.编译:将脚本执行一次,生成中间代码,往后只需调用即可,实现高效率。

    4.编译功能允许重执行中间代码所表示的整个脚本,而调用功能允许重执行脚本中的个别程序或者方法

  接口:

    ScriptEngine:

      代表一个js引擎,引擎的作用就是动起来,这个引擎可以让javascript脚本跑起来。

    Bingings:

      其实就是一个Map,为ScriptEngine设置上下文,就是一些全局变量之类的。

    Compilable:

      将脚本编译成无需重新编译就能够反复执行的某种形式

    Invocable:

      执行脚本中的程序

    ScriptContext:

      引擎执行的上下文,类似ServletContext

    ScriptEngineFactory:

      ScriptEngine的工厂,通过它可以产生ScriptEngine

  类:

    AbstractScriptEngine:

      实现了ScriptEngine接口,为eval方法提供了多种实现

    CompiledScript:

      编译过的脚本,可以重复执行无需重新解析

    ScriptEngineManager:

      为ScriptEngine类实现一个发现和实例化机制,还维护一个键/值对集合来存储所有 Manager 创建的引擎所共享的状态

    SimpleBingdings:

      一个受 HashMap 或其他某些指定 Map 支持的 Bindings 的简单实现

    SimpleScriptContext:

      ScriptContext 的简单实现

  Demo:

    js文件:

function show() {
    return name + " " + age;
}

    java代码:

    @Test
    public void demo() throws Exception {
        //通过ScriptEngineManager拿到一个ScriptEngine
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
        //创建一个Bindings,设置变量
        Bindings bindings = engine.createBindings();
        bindings.put("name", "xujianguo");
        bindings.put("age", 21);
        //为engine设置Bindings
        engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
        //执行脚本文件
        engine.eval(new FileReader("file/model_two.js"));
        //判断引擎的可执行性
        if(engine instanceof Invocable) {
            //转换接口类型
            Invocable invocable = (Invocable)engine;
            //执行特定的方法
            String result = (String) invocable.invokeFunction("show");
            System.out.println(result);
        }
    }
原文地址:https://www.cnblogs.com/rayguo/p/3760701.html