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
凡所有相,皆是虚妄

浙公网安备 33010602011771号