@(Java知識點總結)[Java, 動態字節碼操做]javascript
JDK6.0以後提供了腳本引擎功能,讓咱們能夠執行某些腳本語言,特別是javascript(javascript是一門解釋性語言,動態性很是好)。java
讓JAVA的動態性獲得更充分的體現,某些時候能夠更加靈活的應對需求的變化。python
獲取腳本程序輸入,經過腳本引擎運行腳本並返回運行結果,這是最核心的接口。函數
Rhino 是一種使用 Java 語言編寫的 JavaScript 的開源實現,原先由Mozilla開發,如今被集成進入JDK 6.0。
官方首頁.net
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.net.URL; import java.util.List; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Test09 { // 定義變量,存儲到引擎上下文中 private static void test1(ScriptEngine engine) { engine.put("msg", "張三是個好學生"); System.out.println(engine.get("msg")); // 獲取變量的值 try { engine.eval("msg='java是門好用的語言';"); // 修改變量的值 } catch (ScriptException e1) { e1.printStackTrace(); } System.out.println(engine.get("msg")); } // 定義一個對象 private static void test2(ScriptEngine engine) { String str = "var user = {name:'張三',age:18,subjects:['計算機','英語']};"; str += "println(user.name);"; try { engine.eval(str); } catch (ScriptException e) { e.printStackTrace(); } } // 定義一個函數 private static void test3(ScriptEngine engine) { try { engine.eval("function add(a,b){var sum = a+b;return sum;}"); } catch (ScriptException e) { e.printStackTrace(); } try { // 取得調用接口 Invocable jsInvoke = (Invocable) engine; // 執行腳本中定義的方法 Object result = jsInvoke.invokeFunction("add", new Object[] { 13, 20 }); System.out.println(result); } catch (NoSuchMethodException | ScriptException e) { e.printStackTrace(); } } // 導入其餘java包,使用其餘包中的java類 private static void test4(ScriptEngine engine) { String jsCode = "importPackage(java.util); var list = Arrays.asList([\"浙江大學\",\"清華大學\",\"北京大學\"]); "; try { engine.eval(jsCode); } catch (ScriptException e) { e.printStackTrace(); } List<String> list2 = (List<String>) engine.get("list"); for (String temp : list2) { System.out.println(temp); } } //執行一個js文件(咱們將a.js至於項目的src下便可) private static void test5(ScriptEngine engine) { URL is = Test09.class.getClassLoader().getResource("a.js"); Reader r= null; try { r = new FileReader(is.getPath()); engine.eval(r); } catch (FileNotFoundException | ScriptException e) { e.printStackTrace(); }finally { try { r.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { // 得到腳本引擎 ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine engine = sem.getEngineByName("javascript"); test1(engine); test2(engine); // java 8 出現異常:Caused by: <eval>:1 ReferenceError: "println" is not defined test3(engine); test4(engine); // java 8出現異常:Caused by: <eval>:1 ReferenceError: "importPackage" is not defined test5(engine); } }