返回介绍

2. Bean 脚本框架

发布于 2025-01-04 00:44:54 字数 2328 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文