文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
2. Bean 脚本框架
Bean 脚本框架(BSF,Bean Scripting Framework) 试图通过一个 API 来调用 Java 中的脚本语言。它已经很长时间没有更新过了,但由于支持标准的 JSR-223 API,所以还没有被遗弃。
BSF 引擎由 org.codehaus.groovy.bsf.GroovyEngine
类所实现。但这一事实常常被 BSF 的 API 所掩盖。通过 BSF API,只会把 Groovy 看成其他同样的脚本语言。
由于 Groovy 对 Java 集成有着原生的支持,所以你只需要注意下面两种情形中的 BSF 应用:还想调用其他语言时(如 JRuby ),或者想与你所使用的脚本语言保持一种非常松散的耦合。
2.1 入门
假设在类路径中有 Groovy 和 BSF 的 jar 文件,那么可以使用下列代码运行简单的 Groovy 脚本。
String myScript = "println('Hello World')\n return [1, 2, 3]";
BSFManager manager = new BSFManager();
List answer = (List) manager.eval("groovy", "myScript.groovy", 0, 0, myScript);
assertEquals(3, answer.size());
2.2 传入变量
BSF 可以使你在 Java 和脚本语言间传入 bean。可以注册/不注册 bean,使其被 BSF 所知晓,然后利用 BSF 方法在需要时查找 bean。另外,还可以声明/不声明 bean。这将注册它们,但也使其能够直接用于脚本语言。第二种方法是 Groovy 通常所习惯采用的方法,如下所示:
BSFManager manager = new BSFManager();
manager.declareBean("xyz", 4, Integer.class);
Object answer = manager.eval("groovy", "test.groovy", 0, 0, "xyz + 1");
assertEquals(5, answer);
2.3 其他调用选项
上面的范例使用了 eval
方法。BSF 提供了多种方法(详情参见 BSF 文档 ),其中可用的另一种方法是 apply
。它能让你用脚本语言定义一种匿名函数,然后把该函数应用到参数中。Groovy 利用闭包支持这种函数,如下所示:
BSFManager manager = new BSFManager();
Vector<String> ignoreParamNames = null;
Vector<Integer> args = new Vector<Integer>();
args.add(2);
args.add(5);
args.add(1);
Integer actual = (Integer) manager.apply("groovy", "applyTest", 0, 0,
"def summer = { a, b, c -> a * 100 + b * 10 + c }", ignoreParamNames, args);
assertEquals(251, actual.intValue());
2.4 访问脚本引擎
虽然不是很常用,但 BSF 还是提供了一种钩子,以便直接访问脚本引擎。引擎所执行的一个函数是在对象上调用一个方法。如下所示:
BSFManager manager = new BSFManager();
BSFEngine bsfEngine = manager.loadScriptingEngine("groovy");
manager.declareBean("myvar", "hello", String.class);
Object myvar = manager.lookupBean("myvar");
String result = (String) bsfEngine.call(myvar, "reverse", new Object[0]);
assertEquals("olleh", result);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论