天天看点

嵌入Groovy

groovy就其本身而言,在不同的场景下都算是一门非常不错的编程语言,特别是在与java混用的环境下,groovy显得更加强大。出于这种考虑,groovy被设计成非常轻量级,并且易于嵌入到任何java应用系统中。

目前主要有3种方法将groovy与java集成起来,细节会在下文中讨论。

还有一种可选方案是,如果你确实需要使用其他脚本语言,可以利用bean scripting framework将任何脚本语言集成到你的java代码中(虽然我们难以想象这么做的原因)。

利用shell执行脚本或者表达式

你可以使用groovyshell执行groovy中的任何表达式或者脚本。

groovyshell允许你通过binding对象传进和传出变量。

将groovy脚本继承自一个你选择的基类,之后便可以访问脚本的常规方法,这种做法往往非常有用。可以通过在编译配置中设置脚本基类属性,并将新的编译配置传递给shell完成这一操作。

你可以在java代码中直接使用groovyclassloader动态地加载和执行groovy类。java代码如下:

如果你想在java里使用一个接口,但是接口的实现在groovy脚本中,可以这样:

如果这个groovy类实现了接口myinterface,这么做是没有问题的。从现在开始myobject可以像其他实现了myinterface接口的类一样使用。

需要注意的一点是,parseclass 方法会从你的字符串文件名中创建一个对象。另一个gcl.parseclass的用法是:

完整的例子如下所示:

请注意,所有的异常处理都已经被移除了,你不必在java类中关心这个。实际上我会在一个工具类中完成groovy的接口调用。

如果开发人员想把groovy脚本嵌入到服务器内,并且在脚本变更之后也能够重新加载,groovyscriptengine是一个主要的解决方案。你可以使用一个classpath集合(url或者路径名称)初始化groovyscriptengine,之后便可以执行这些路径中的groovy脚本了。groovyscriptengine同样可以跟踪相互依赖的脚本,如果其中一个被依赖的脚本发生变更,则整个脚本树都会被重新编译和加载。

此外,每次脚本的执行,还可以利用一个脚本可以访问的包含了最新参数的binding对象传递信息。例子如下:

输出是“hello, world!”。