JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。
生活随笔
收集整理的這篇文章主要介紹了
JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JDK1.6版添加了新的ScriptEngine類,允許用戶直接執(zhí)行js代碼。
在Java中直接調(diào)用js代碼
package?com.sinaapp.manjushri;??? import?javax.script.ScriptEngine;??? import?javax.script.ScriptEngineManager;?? import?javax.script.ScriptException;???/**??*?直接調(diào)用js代碼??*/?? ?????????? ??public?class?ScriptEngineTest?{?????? ????public?static?void?main(String[]?args)?{??? ????????ScriptEngineManager?manager?=?new?ScriptEngineManager();?? ????????ScriptEngine?engine?=?manager.getEngineByName("javascript");?? ??????????try?{?????? ????????????engine.eval("var?a=3;?var?b=4;print?(a+b);");?????? ????????????//?不能調(diào)用瀏覽器中定義的js函數(shù)?????? ????????????//?engine.eval("alert(\"js?alert\");");????? ????????????//?錯(cuò)誤,會(huì)拋出alert引用不存在的異常????? ??????????}?catch?(ScriptException?e)?{?? ??????????????e.printStackTrace();????? ??????????}???? ??????}????? }??
在Java中綁定js變量
在調(diào)用engine.get(key);時(shí),如果key沒有定義,則返回null
package?com.sinaapp.manjushri;????? import?javax.script.Bindings;??? import?javax.script.ScriptContext;??? import?javax.script.ScriptEngine;??? import?javax.script.ScriptEngineManager;??? import?javax.script.ScriptException;????? ???????????? public?class?ScriptEngineTest2?{??? ????public?static?void?main(String[]?args)?{????? ????????ScriptEngineManager?manager?=?new?ScriptEngineManager();????? ??????????ScriptEngine?engine?=?manager.getEngineByName("javascript");????? ??????????engine.put("a",?4);???engine.put("b",?3);????? ??????????Bindings?bindings?=?engine.getBindings(ScriptContext.ENGINE_SCOPE);?? ??????????try?{?? ??????????????//?只能為Double,使用Float和Integer會(huì)拋出異常?? ??????????????Double?result?=?(Double)?engine.eval("a+b");?? ??????????????System.out.println("result?=?"?+?result);?? ??????????????engine.eval("c=a+b");?? ??????????????Double?c?=?(Double)engine.get("c");?? ??????????????System.out.println("c?=?"?+?c);?? ??????????}?catch?(ScriptException?e)?{?? ??????????????e.printStackTrace();????? ??????????}???? ??????}??? ??}??
輸出:
result?=?7.0
c?=?7.0在Java中調(diào)用js文件中的function,傳入調(diào)用參數(shù),并獲取返回值
js文件中的merge函數(shù)將兩個(gè)參數(shù)a,b相加,并返回c。
[javascript]?view plain?copy//?expression.js??? function?merge(a,?b)?{??? ?????c?=?a?*?b;??? ?????return?c;??? }?? 在Java代碼中讀取js文件,并參數(shù)兩個(gè)參數(shù),然后回去返回值
[java]?view plain?copypackage?com.sinaapp.manjushri;???? ?import?java.io.FileReader;???? ?import?javax.script.Invocable;?? ?import?javax.script.ScriptEngine;?? ?import?javax.script.ScriptEngineManager;???? ?/**??*?Java調(diào)用并執(zhí)行js文件,傳遞參數(shù),并活動(dòng)返回值??*???*?@author?manjushri??*/?? ?public?class?ScriptEngineTest?{????? ?????public?static?void?main(String[]?args)?throws?Exception?{????? ????????ScriptEngineManager?manager?=?new?ScriptEngineManager();????? ????????ScriptEngine?engine?=?manager.getEngineByName("javascript");?????? ?????????String?jsFileName?=?"expression.js";???? ?????????//?讀取js文件????? ????????FileReader?reader?=?new?FileReader(jsFileName);????? ????????//?執(zhí)行指定腳本???? ?????????engine.eval(reader);????? ????????if(engine?instanceof?Invocable)?{????? ?????????????Invocable?invoke?=?(Invocable)engine;?????? ????????????//?調(diào)用merge方法,并傳入兩個(gè)參數(shù)????? ?????????????//?c?=?merge(2,?3);????? ?????????????Double?c?=?(Double)invoke.invokeFunction("merge",?2,?3);????? ?????????????System.out.println("c?=?"?+?c);????? ????????}????? ????reader.close();??? ?}??? }?? 輸出結(jié)果:
c?=?5.0
在Java中直接調(diào)用js代碼
不能調(diào)用瀏覽器中定義的js函數(shù),會(huì)拋出異常提示ReferenceError:?“alert”?is?not?defined。
[java]?view plain?copy輸出結(jié)果:7
在Java中綁定js變量
在調(diào)用engine.get(key);時(shí),如果key沒有定義,則返回null
[java]?view plain?copy
result?=?7.0
c?=?7.0
在Java中調(diào)用js文件中的function,傳入調(diào)用參數(shù),并獲取返回值
js文件中的merge函數(shù)將兩個(gè)參數(shù)a,b相加,并返回c。[javascript]?view plain?copy
c?=?5.0
總結(jié)
以上是生活随笔為你收集整理的JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java动态编译执行
- 下一篇: 架构师之路17年精选80篇