优势:
计算员工工资,但是不同员工有不同算法,希望通过每个员工对应一个表达式,用脚本语言直接进行计算。
引入脚本引擎
//获得引擎管理器
ScriptEngineManager sem=new ScriptEngineManager();
//引入JS引擎
ScriptEngine engine=sem.getEngineByName("javascript");
执行字符串脚本代码
//var有多个属性 name age schools 可以通过user调用它的属性
String str="var user={name:'LINDA',age:18,schools:['tinghua','beijing']};";
//JDK1.6或者1.7可以写println但是1.8之后就不能使用println
//ReferenceError: "println" is not defined in <eval> at line number 1
str+="print(user.name);";
//运行JS代码
engine.eval(str);
定义JS变量
//将键值对放入引擎
engine.put("msg","LINDA is a good girl ");
System.out.println((String) engine.get("msg"));
//通过JS代码改变msg的值
engine.eval("msg='LINDA is a good girlfriend';");
//java代码也可以获取它的值
System.out.println((String) engine.get("msg"));
定义JS函数
engine.eval("function add(a,b){var sum=a+b;return sum;}");
//执行函数(先混个眼熟吧)
Invocable jsInvoke= (Invocable) engine;
Object result=jsInvoke.invokeFunction("add",new Object[]{13,20});
System.out.println(result);
需要使用JAVA包下的类
//这里导包的方法JDK1.8 更新了之前的版本不同
String jsCode="var list=java.util.Arrays.asList([\"beijing\",\"shanghai\"]);";
engine.eval(jsCode);
List<String>list= (List<String>) engine.get("list");
for (String str2:list
) {
System.out.println(str2);
}
导入某个地方js文件并运行
URL url=Demo01.class.getClassLoader().getResource("a.js");
//字符节点流引入JS代码,写入引擎,运行
FileReader fr=new FileReader(url.getPath());
engine.eval(fr);
fr.close();