脚本语言的支持
JSR 223中规范了在Java虚拟机上运行的脚本语言与Java程序之间的交互方式。JSR 233是JavaSE6的一部分,在Java表中API中的包是javax.script。目前Java虚拟机支持比较多的脚本语言,比较流行的有JavaScript、Scala、JRuby、Jython和Groovy等。
脚本引擎
Java中执行脚本需要脚本语言对应的脚本引擎,JSR 233 定义了脚本引擎的注册和查找机制。JavaSE6 中自带了JavaScript 语言的脚本引擎,可以通过三种方式获取到脚本引擎。
// 通过脚本名称获取
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
// 通过文件扩展名获取
ScriptEngine engine1 = new ScriptEngineManager().getEngineByExtension("js");
// 通过 MIME 类型来获取
ScriptEngine engine2 = new ScriptEngineManager().getEngineByMimeType("text/javascript");
调用脚本语言
1、使用 eval(String script) 直接调用脚本语言。
// 获取 ScriptEngineManager 对象用于创建 ScriptEngine 对象
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
// 通过 eval 方法可以调用脚本语句,获取返回值
Double hour = (Double) engine.eval("var date = new Date();" + "date.getHours();");
System.out.println("hour : " + hour);
2、使用 put(String key,Object value) 在ScriptEngine 的状态下设置一个键/值对,以便在脚本中调用。
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
// 设置一个变量名为 name 值为 abcdefg
engine.put("name", "abcdefg");
// js 代码将 name 从后往前赋值给 output
engine.eval("var output ='' ;" + "for (i = 0; i <= name.length; i++) { " + " output = name.charAt(i) + output" + "}");
// 获取在该引擎下的值
String name = (String) engine.get("output");
System.out.printf("被翻转后的字符串:%s \n", name);
3、使用 eval(Stirng script,Bindings n) 执行脚本,并传入脚本所需要的参数,Bindings 其实也是键值对的一个类,继承自 Map。
// 定义一个脚本语句
String str="Math.pow(a,b)";
// 定义一个 Map,往里面赋值用于传参
Map<String, Object>input=new TreeMap<>();
input.put("a",2);
input.put("b",8);
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
// 调用 eval 方法,第一个参数为脚本语句,第二个参数为键值对 SimpleBindings 实现了 Bindings
System.out.println(engine.eval(str,new SimpleBindings(input)));
4、调用 js 函数,并传入参数
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
engine.eval("function add (a, b) {return a+b; }");
// 由ScriptEngines实现的可选接口,其方法允许在先前执行的脚本中调用过程。
Invocable jsInvoke = (Invocable) engine;
// 用于调用脚本中定义的顶级过程和函数
Object res = jsInvoke.invokeFunction("add", new Object[] { 10, "5" });
System.out.println(res);
5、java 中获取 js 对象
String str = " var obj=new Object(); "
+ " obj.info='hello world'; "
+ " obj.getInfo=function(){ "
+ " return this.info; "
+ " }; ";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
engine.eval(str);
//获取对象
ScriptObjectMirror obj=(ScriptObjectMirror) engine.get("obj");
//输出属性
System.out.println(obj.get("info"));
System.out.println(obj.get("getInfo"));
str="obj.getInfo()";
//执行方法
System.out.println(engine.eval(str));
String str = " var msg='hello'; "
+ " var number = 123; "
+ " var array=['A','B','C']; "
+ " var json={ "
+ " 'name':'pd', "
+ " 'subjson':{ "
+ " 'subname':'spd' "
+ " ,'id':123 "
+ " } "
+ " }; ";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
//执行语句
engine.eval(str);
str="msg+=' world';number+=5";
//再次执行
engine.eval(str);
//获取js变量msg(String类型)
System.out.println(engine.get("msg"));
//获取js变量msg(int类型)
System.out.println(engine.get("number"));
//获取js变量array(数组)
ScriptObjectMirror array=(ScriptObjectMirror) engine.get("array");
//getSlot(int index)函数用于获取下标为index的值
System.out.println(array.getSlot(0));
//获取js变量json(json类型)
ScriptObjectMirror json=(ScriptObjectMirror) engine.get("json");
//get(String key)函数用于键key的值
System.out.println(json.get("name"));
//获取js变量subjson(嵌套json类型)
ScriptObjectMirror subjson=(ScriptObjectMirror)json.get("subjson");
System.out.println(subjson.get("subname"));
其他的内容就根据API进行深入学习吧