扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
上面的例子只有一个函数,可以通过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("这个脚本引擎不支持动态调用"); } } |
脚本引擎还有一个更吸引的功能,那就是动态实现接口。如我们要想让脚本异步地执行,即通过多线程来执行,那InvokeEngine类必须实现Runnable接口才可以通过Thread启动多线程。因此,可以通过getInterface方法来使InvokeEngine动态地实现Runnable接口。这样一般可分为3步进行。
1. 使用javascript编写一个run函数
engine.eval("function run() {print('异步执行');}"); |
2. 通过getInterface方法实现Runnable接口
Runnable runner = invokeEngine.getInterface(Runnable.class); |
3. 使用Thread类启动多线程
Thread t = new Thread(runner); t.start(); |
下面是实现这个功能的详细代码。
import javax.script.*; public class InterfaceTest |
其实上面的代码是通过javascript实现了Runnable接口的run方法。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者