扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
众所周知,解释运行方式是最慢的运行方式。上述的几个例子无一例外地都是以解释方式运行的。由于Java EE 6的脚本引擎可以支持任何实现脚本引擎接口的语言。有很多这样的语言提供了编译功能,也就是说,在运行脚本之前要先将这些脚本进行编译(这里的编译一般将不是生成可执行文件,而只是在内存中编译成更容易运行的方式),然后再执行。如果某段脚本要运行之交多次的话,使用这种方式是非常快的。我们可以使用ScriptEngine的compile方法进行编译。并不是所有脚本引擎都支持编译,只有实现了Compilable接口的脚本引擎才可以使用compile进行编译,否则将抛出一个错误。下面的例子将演示如何使用compile方法编译并运行javascript脚本。
import javax.script.*; import java.io.*; import static java.lang.System.*; public class CompileScript { public static void main(String args[]) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); engine.put("counter", 0); // 向javascript传递一个参数 // 判断这个脚本引擎是否支持编译功能 if (engine instanceof Compilable) { Compilable compEngine = (Compilable)engine; try { // 进行编译 CompiledScript script = compEngine.compile("function count() { " + " counter = counter +1; " + " return counter; " + "}; count();"); out.printf("Counter: %s%n", script.eval()); out.printf("Counter: %s%n", script.eval()); out.printf("Counter: %s%n", script.eval()); } catch (ScriptException e) { err.println(e); } } else { err.println("这个脚本引擎不支持编译!"); } } } |
上面的代码运行后的显示信息如下:
在这个例子中,先通过compile方法将脚本编译,然后通过eval方法多次进行调用。在这段代码中只有一个函数,因此,eval就返回了这个函数的值。
动态调用脚本语言的方法
上面的例子只有一个函数,可以通过eval进行调用并将它的值返回。但如果脚本中有多个函数或想通过用户的输入来决定调用哪个函数,这就需要使用invoke方法进行动态调用。和编译一样,脚本引擎必须实现Invocable接口才可以动态调用脚本语言中的方法。下面的例子将演示如何通过动态调用的方式来运行上面的翻转字符串的javascript脚本。
import javax.script.*; import java.io.*; import static java.lang.System.*; public class InvocableTest { public static void main(String args[]) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); if (engine instanceof Invocable) { try { engine.eval("function reverse(name) {" + " var output = '';" + " for (i = 0; i <= name.length; i++) {" + " output = name.charAt(i) + output" + " } return output;}"); Invocable invokeEngine = (Invocable)engine; Object o = invokeEngine.invoke("reverse", name); out.printf("翻转后的字符串:%s", name); } catch (NoSuchMethodException e) { err.println(e); } catch (ScriptException e) { err.println(e); } } else { err.println("这个脚本引擎不支持动态调用"); } } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者