jdk1.8在java中执行js代码
案例一 变量的存放
// 得到所有的脚本引擎工厂 ScriptEngineManager sem = new ScriptEngineManager(); // 得到javascript脚本引擎 ScriptEngine engine = sem.getEngineByName("javascript"); //向上下文中存入变量 engine.put("msg", "just a test"); //定义类user String str = "msg += '!!!';var user = {name:'tom',age:23,hobbies:['football','basketball']}; "; // 开始运行脚本 engine.eval(str); //从上下文引擎中取值 String msg = (String) engine.get("msg"); System.out.println(msg); Object user = engine.get("user"); Gson gson = (new GsonBuilder()).setPrettyPrinting().create(); //System.out.println(gson.toJson(user)); //可用指定不同scope进行获取值 ScriptContext context = engine.getContext(); Object user1 = context.getAttribute("user"); //System.out.println(gson.toJson(user1)); HashMap o = Demo1.toType(user, HashMap.class); System.out.println(o);
案例二 运行js函数
// 得到所有的脚本引擎工厂 ScriptEngineManager sem = new ScriptEngineManager(); // 得到javascript脚本引擎 ScriptEngine engine = sem.getEngineByName("javascript"); //定义数学函数 engine.eval("function add (a, b) {c = a + b; return c; }"); //取得调用接口 Invocable jsInvoke = (Invocable) engine; //定义加法函数 Object result1 = jsInvoke.invokeFunction("add", new Object[]{10, 5}); System.out.println(result1);
案例三 定义线程运行
// 得到所有的脚本引擎工厂 ScriptEngineManager sem = new ScriptEngineManager(); // 得到javascript脚本引擎 ScriptEngine engine = sem.getEngineByName("javascript"); // 定义run()函数 engine.eval("function run() {print('www.java2s.com');}"); Invocable invokeEngine = (Invocable) engine; Runnable runner = invokeEngine.getInterface(Runnable.class); //定义线程运行之 Thread t = new Thread(runner); t.start(); t.join();
案例四 在js中引用java的包
/* * * 一. //jdk1.6的使用方法规则 1.8已经不适用了 String jsCode = "importPackage java.util; var list = Arrays.asList([\"北京尚学堂\",\"清华大学\",\"北京大学\"]);"; //jkd1.8的使用规则如下: String jsCode1 = "var list = java.util.Arrays.asList([\"北京尚学堂\",\"清华大学\",\"北京大学\"]);"; 二.如果出现 "println" is not defined in <eval>, 则将"println"改"print" * */ // 得到所有的脚本引擎工厂 ScriptEngineManager sem = new ScriptEngineManager(); // 得到javascript脚本引擎 ScriptEngine engine = sem.getEngineByName("javascript"); // 导入其他java包 String jsCode = "var list2 = java.util.Arrays" + ".asList(['A', 'B', 'C']); "; engine.eval(jsCode); List<String> list2 = (List<String>) engine.get("list2"); for (String val : list2) { System.out.println(val);}
案例五 加载本地的js文件并执行
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); String jsFileName = "C:\\Users\\13900\\Desktop\\javajs\\src\\test" + "\\java\\test\\expression.js"; // 读取js文件 FileReader reader = new FileReader(jsFileName); // 执行指定脚本 engine.eval(reader); if(engine instanceof Invocable) { Invocable invoke = (Invocable)engine; // 调用merge方法,并传入两个参数 // c = merge(2, 3); Double c = (Double)invoke.invokeFunction("merge", 2, 3); System.out.println("c = " + c); } reader.close();
*将数据对象转换成java中指定的数据结构,需要引入谷歌Gson依赖包
//将数据对象转换成指定的java中指定的数据结构 public static <T> T toType(Object obj, Type type, Type... typeArguments) { Gson gson = new Gson(); JsonElement je = gson.toJsonTree(obj); return (T) (typeArguments != null && typeArguments.length != 0 ? gson.fromJson(je, TypeToken.getParameterized(type, typeArguments).getType()) : gson.fromJson(je, type)); }
ScriptEngine东西很多
具体可以查阅官方文档 https://docs.oracle.com/javase/7/docs/api/javax/script/ScriptEngine.html
凡所有相,皆是虚妄