Java知识点总结(动态实行JS代码 )

Java知识点总结(动态实行JS代码 )

@(Java知识点总结)[Java, 动态字节码操纵]

JDK6.0以后供应了剧本引擎功用,让我们能够实行某些剧本言语,特别是javascript(javascript是一门解释性言语,动态性非常好)。

让JAVA的动态性取得更充足的表现,某些时刻能够越发天真的应对需求的变化。

剧本引擎引见:
  • 使得 Java 应用顺序能够经由过程一套牢固的 接口与种种剧本引擎 交互,从而到达在 Java 平台上挪用种种剧本言语的目标 。
  • Java 剧本 API 是连通 Java 平台和剧本言语 的 桥梁 。
  • 能够把一些庞杂异变的营业逻辑交给剧本言语处置惩罚,这又大大提高了开辟效力。
Java 剧本 API 为开辟者供应了以下功用:
  • 猎取剧本顺序输入,经由过程剧本引擎运转剧本并返回运转效果,这是最中心的接口。

    • 注重是:接口。 Java能够运用种种差别的完成,从而通用的挪用 js 、 groovy 、 python 等剧本。
  • 经由过程 剧本引擎 的运转高低文在剧本和 Java 平台间交流数据。
  • 经由过程 Java 应用顺序挪用剧本函数。
JS剧本引擎Rhino

Rhino 是一种运用 Java 言语编写的 JavaScript 的开源完成,原先由Mozilla开辟,现在被集成进入JDK 6.0。
官方首页

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);
  }
 
} 
    原文作者:苏生
    原文地址: https://segmentfault.com/a/1190000015664762
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞