JSR 233 为 Java 设计了一套脚本语言 API。这一套 API 提供了在 Java 程序中调用各种脚本语言引擎的接口。任何实现了这一接口的脚本语言引擎都可以在 Java 程序中被调用。在 Mustang 的发行版本中包括了一个基于 Mozilla Rhino 的 JavaScript 脚本引擎。
通过jdk6以后提供的脚本引擎,java语言和脚本语言可以非常方便的交互,给我们进行 软件架构 带来新的思路。
import javax.script.*;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;
/**
* Created by wangpl on 1/16/15.
*/
public class Test {
public static void main(String[] args) throws ScriptException, FileNotFoundException, NoSuchMethodException {
ScriptEngineManager manager = new ScriptEngineManager();
// 打印所有的脚本引擎
for (ScriptEngineFactory factory : manager.getEngineFactories()) {
System.out.println(factory.getEngineName());
}
ScriptEngine engine = manager.getEngineByName ("JavaScript");
// ScriptEngine engine = manager.getEngineByExtension ("js");
// ScriptEngine engine = manager.getEngineByMimeType ("application/javascript");
System.out.println(engine.getFactory().getEngineName());
// 直接执行脚本
engine.eval("print ('Hello World')");
// 绑定java方法,供脚本使用
HelloWorld hello = new HelloWorld();
engine.put("script_hello", hello);//绑定
engine.eval("script_hello.sayHello('Li Sir')");//在脚本中使用,也可以直接写在外部js文件中调用
// 执行脚本文件
engine.eval(new FileReader("/home/wangpl/mine/WORK_SPACE/idea_work/Eden/jse/src/main/java/HelloWorld.js"));
// 脚本函数 调用
String script = "function say(first,second) { print(first +' '+ second); }";
engine.eval(script);
Invocable inv = (Invocable) engine;
inv.invokeFunction("say", "Hello", "Tony");
//到目前为止,我们的脚本全部都是解释执行的,相比较之下编译执行将会获得更好的性能。这里将介绍 ScriptEngine 的另外一个可选接口 —— Compilable,
//实现了Compilable接口的脚本引擎支持脚本的编译执行。下面这个例子实现了一个判断给定字符串是否是 email 地址或者 ip 地址的脚本:
String myScript = "var email=/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]"
+ "+(\\.[a-zA-Z0-9_-]+)+$/;";
myScript += "var ip = /^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])"
+"(\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])){3}$/;";
myScript += "if(email.test(str)){println('it is an email')}"
+ "else if(ip.test(str)){println('it is an ip address')}"
+ "else{println('I don\\'t know')}";
engine.put("str", "email@address.tony");
Compilable compilable = (Compilable) engine;
CompiledScript compiled = compilable.compile(myScript);
compiled.eval();
}
}
js文件内容:
print ('I am from HelloWorld.js')
script_hello.sayHello('JS Sir')
其它:
Apache BSF 提供了一个脚本语言交互框架, 具有更多功能。
http://www.ibm.com/developerworks/cn/java/j-lo-mustang-script/
http://www.ibm.com/developerworks/cn/web/wa-aj-javaee/