Java语言是静态语言,编译的时候会进行类型的检查,变量的类型必须进行声明,同时方法的参数与返回值必须在程序运行之前就是已知的,这种特性使编译器可以进行错误的检查,这种做法的弊端是存在大量的不必要的类型声明,代码不够简洁.与静态语言对应的是动态语言例如JavaScript,动态语言类型检查是在运行的时候进行的,这样代码相对比较简洁,现在介绍一下在Java虚拟机上运行脚本语言例如JavaScript的方式:
ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript"); if(scriptEngine ==null){ throw new RuntimeException("没有名称为JavaScript的脚本引擎"); } scriptEngine.eval("println('hello javascript ')");系统输出:hello javascript
其中
ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript"); if(scriptEngine ==null){ throw new RuntimeException("没有名称为JavaScript的脚本引擎"); } scriptEngine.eval("println('hello javascript ')"); scriptEngine.put("name","javascript"); scriptEngine.eval("var message = 'hello:'+name"); scriptEngine.eval("println(message)"); System.out.println(scriptEngine.get("message"));注意put方法相当于想JavaScript默认的绑定对象中添加name属性,get方法相当于从JavaScript默认的绑定对象中输出name属性的值
系统输出:hello javascript
hello:javascript
hello:javascript
利用绑定
Bindings :
ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript"); if(scriptEngine ==null){ throw new RuntimeException("没有名称为JavaScript的脚本引擎"); } Bindings bindings = new SimpleBindings(); bindings.put("hobby","i like javascript"); scriptEngine.eval("println('My hobby:'+hobby)",bindings); }ScriptContext:
输入输出
将JavaScript内容输出到文件中
ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript"); if(scriptEngine ==null){ throw new RuntimeException("没有名称为JavaScript的脚本引擎"); } ScriptContext scriptContext = scriptEngine.getContext(); scriptContext.setWriter( new FileWriter("d://123.txt")); scriptEngine.eval("println('javascript')");
设置与获取属性:有优先级优先级高的覆盖优先级低的
ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript"); if(scriptEngine ==null){ throw new RuntimeException("没有名称为JavaScript的脚本引擎"); } ScriptContext scriptContext = scriptEngine.getContext(); scriptContext.setAttribute("name","bob",ScriptContext.GLOBAL_SCOPE); scriptContext.setAttribute("name","alen",ScriptContext.ENGINE_SCOPE); System.out.println(scriptContext.getAttribute("name"));系统输出:alen