Mustang中的Scripting应用
Mustang中的Scripting应用
由 cobra 于 周五, 2007-01-05 14:56 提交。今天大概看了看Java 6的新特性,其中最让我感到兴奋的就是Java 6中的Scripting应用。PHP、Ruby、JavaScript、Python(或Jython)之类的脚本编写语言被广泛应用于许多领域,并由于其灵活性和简单性而大受欢迎。由于脚本是被解释而不是被编译的,所以可以轻松地从命令行运行和测试它们。这就压缩了编码/测试周期,并提高了开发人员的生产率。脚本通常是动态键入的,其语法极富表现力,所编写出的算法要比Java中的等效算法简明得多。使用起来通常也很有趣。 在很多情况下,从Java使用脚本编写语言会很有用,比如为Java应用程序提供扩展,以便用户可以编写自己的脚本进行扩展或定制化核心功能。脚本编写语言可读性更强,也更容易编写,所以(从技术上来说)它们是用于为终端用户提供根据需求定制化产品的可能性的理想语言。 下面介绍以下如何使用Java 6将Javascript嵌入其中。 Hello Mustang public void test1() throws ScriptException { // 创建脚本引擎 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); // 通过eval方法执行脚本程序 engine.eval("print('Hello Mustang');"); } 这段程序的输出为:Hello Mustang。 同时我还可以将一段写好的Javascritp程序保存在一个文件中,如./js/test.js,程序内容为: print("Hello Mustang"); 对应的Java程序需要将./js/test.js读取到ScriptEngine的实例中,我们需要使用FileReader对象,修改过的程序如下: public void test2() throws ScriptException, FileNotFoundException { // 创建脚本引擎 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); // 通过eval方法执行脚本程序 // 使用FileReader将需要运行的文件传入engine中 engine.eval(new FileReader("./js/test.js")); } 如何在Javascript中调用Java的对象 修改./js/test.js,将其改为如下内容: var date = new java.util.Date(); print(date); 运行test2()方法得到如下内容: Fri Jan 05 14:30:34 GMT+08:00 2007 如何将使用Java对Javascript进行赋值 修改./js/test.js,内容如下: print("i=" + i); 创建Java程序 public void test3() throws ScriptException, FileNotFoundException { // 创建脚本引擎 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); //使用put为脚本程序进行赋值 engine.put("i", 90); // 通过eval方法执行脚本程序 // 使用FileReader将需要运行的文件传入engine中 engine.eval(new FileReader("./js/test1.js")); } 运行结果如下: i=90 如何在Java调用Javascript的函数 首先创建一个判断奇偶数的函数isEven(i),程序如下: function isEven(i) { if ((i%2) == 0) { return "even"; } else { return "odd"; } } 然后创建Java调用程序 public void test4(int i) throws FileNotFoundException, ScriptException, NoSuchMethodException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.eval(new FileReader("./js/test.js")); // ScriptEngine转行为Invocable // 并调用Invocable中的invokeFunction方法 Invocable invocable = (Invocable) engine; Object result = invocable.invokeFunction("isEven", i); System.out.println("Javascript 运行结果" + result); } 在这里需要说明的是invokeFunction中第一个参数为要调用的脚本函数名,后一个参数为一个可变参数用来满足脚本函数多参的需要。
最新评论
5 天 3 小时 前
6 天 23 小时 前
6 天 23 小时 前
1 周 1 天 前
1 周 1 天 前
4 周 4 天 前
1 年 11 周 前
1 年 11 周 前
1 年 49 周 前
1 年 51 周 前