Jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持。这无疑是一个很好的功能,毕竟Java的语法不是适合成为动态语言。而JDK通过执行JavaScript脚本可以弥补这一不足。这也符合“Java虚拟机不仅仅是Java一种语言的虚拟机“这一目标。

ScriptEngine功能强大,基本能实现笔者所能想到的Java与JavaScript交互的需求。而且十分的方便简洁。jdk1.8又对ScriptEngine接口进行了一定改变,因此,在jdk1.8能运行的代码,在1.6中可能会报错,反之亦然。

@Test
    public void testScript2() throws Exception{
        ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("javascript");
        String script = "var msg = 'hello'; " +
                "var number = 123; " +
                "var array = ['a','b','c']; " +
                "var json = {" +
                "   'name':'zwh'," +
                "   'subjson':{" +
                "       'subname':'zwhsub'," +
                "       'subage':23" +
                "   }" +
                "}; ";
        //获取js变量
        scriptEngine.eval(script);
        System.out.println(scriptEngine.get("msg"));
        System.out.println(scriptEngine.get("number"));
        ScriptObjectMirror array = (ScriptObjectMirror)scriptEngine.get("array");
        System.out.println(array.getSlot(0));
        ScriptObjectMirror json = (ScriptObjectMirror)scriptEngine.get("json");
        System.out.println(json.get("name"));
        ScriptObjectMirror subJson = (ScriptObjectMirror)json.get("subjson");
        System.out.println(subJson.get("subname"));
        //添加脚本
        System.out.println("==============================");
        String script2 = "msg +=' world';" +
                "number += 5";
        scriptEngine.eval(script2);
        System.out.println(scriptEngine.get("msg"));
        System.out.println(scriptEngine.get("number"));
        ScriptObjectMirror array2 = (ScriptObjectMirror)scriptEngine.get("array");
        System.out.println(array2.getSlot(0));
        ScriptObjectMirror json2 = (ScriptObjectMirror)scriptEngine.get("json");
        System.out.println(json2.get("name"));
        ScriptObjectMirror subJson2 = (ScriptObjectMirror)json.get("subjson");
        System.out.println(subJson2.get("subname"));
        
        //传入参数
        System.out.println("==============================");
        String script3 = "Math.pow(a,b)";
        Bindings bindings = scriptEngine.createBindings();
        bindings.put("a",2);
        bindings.put("b",3);
        System.out.println(scriptEngine.eval(script3, bindings));
        
        //调用方法
        System.out.println("===============================");
        String script4 = "function add(a,b){return a-b;}";
        scriptEngine.eval(script4);
        Invocable invocable = (Invocable)scriptEngine;
        System.out.println(invocable.invokeFunction("add", new Object[]{3, 4}));
    }

CompiledScript可以认为是对script解析一个缓存。

@Test
    public void scriptTest(){
        try{

            ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
            String script = "a > b";
            CompiledScript compiledScript = ((Compilable)engine).compile(script);

            Bindings bindings = engine.createBindings();
            bindings.put("a",23);
            bindings.put("b",1);

            Object result = compiledScript.eval(bindings);
            System.out.println(result);

            String script2 = "a < b";
            CompiledScript compiledScript2 = ((Compilable)engine).compile(script2);
            bindings.put("a",233);
            bindings.put("b",1);
            Object result2 = compiledScript2.eval(bindings);
            System.out.println(result2);
            Object result3 = compiledScript.eval(bindings);
            System.out.println(result3);

        }catch(Exception e){
            e.printStackTrace();
        }
    }

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐