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 protected]"); Compilable compilable = (Compilable) engine; CompiledScript compiled = compilable.compile(myScript); compiled.eval(); } }
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/