Groovy1.7.4及1.8-beta-1几天前已经发布,其中1.8-beta-1多了不少新特性。
Groovy1.7.4修改了使用GroovyScriptEngine自动重装载、联合编译(joint compiler——该机制确保Groovy和Java可以无缝集成)及Enums语法问题等若干问题;新增了File.renameTo(String fileName)方法,set的减法及交集,并可在console中编译脚本。
Groovy 1.8-beta-1增加了许多新特性:
- 闭包现在是“callable”(继承java.util.concurrent.Callable)
- 增加许多新的AST变换
- @Log 在类中注入logger
- @ScriptField 在脚本中创建属性
- @PackageScope 原先只能用于field,现在对method和class也可用
- @Synchronized 提供更安全的同步语义
- @InheritConstructors 继承构造器
- @IndexedProperties 增加JavaBean带索引的属性(indexed property)
- @AutoClone 支持bean自动克隆
- @AutoExternalize 自动外化(externalization)POGO
- @Canonical 加入适当的equals()、hashCode()、toString()方法
- @EqualsAndHashCode 加入适当的equals()、hashCode()方法
- @ToString 创建默认toString()方法
- @TupleConstructor 加入元组构造器(tuple constructor)
- 新增字符串语法$/.../$,忽略其中的各种转移字符,如$/a/b\c$$ $//$表示字符串a/b\c$$ $/(我个人非常喜欢这个特性)
- 新增一些GDK方法,如:Map.countBy{},Map.collectEntries{},Date.putAt()(下标操作),Date.updated()
- 其他改进
- 新字符串方法:tr(), stripMargin(), stripIndent(), (un)expand(),
- Map的withDefault{}
- 闭包的ncury()和rcury()
- Sql的withBatch{}和withTransaction{}
在Groovy 1.8中,将允许闭包作为注解参数使用(为了兼容,其实际被转换为一个类参数)。关于这一特性,本站点相关文章已有涉及:“用闭包增强注解”,只不过在那篇文章里,这一特性是spock提供的。当然,既然Groovy 1.8要直接支持这一特性,使用起来就没那么麻烦了。Groovy 1.8最终版预计年底发行。
关于这两个版本的更多内容,请参见以下资源:

GroovyScriptEngine
GroovyScriptEngine 是不是只支持Groovy语言脚本。。不支持其他语言脚本?
ScriptEngine是支持的。
选择哪个得看你的需求
ScriptEngine和GroovyScriptEngine的关系就像是JDBC规范和各数据库厂商的JDBC实现一样,虽然GroovyScriptEngine不是直接实现ScriptEngine接口。前者只是规范,不是实现,后者是针对Groovy的实现。
Groovy已经有兼容jsr 223的实现,因此,只要你严格按照ScriptEngine的接口来,理论上,你可以动态的去使用各种脚本,如一会儿用Groovy,一会儿去用Scala,无非就是换一下要创建的脚本名字(如:ScriptEngine engine = factory.getEngineByName("groovy");),以及要计算的脚本字符串(如:engine.eval("(1..10).sum()"))。但前提是,你仍需要各种脚本的实现,而不是只有一个ScriptEngine就行了的。这个跟JDBC一样,你完全可以在程序中既去连Oracle,也可以去连MySQL,但需要包含这两个数据库的JDBC Driver。
这个URL,http://groovy.codehaus.org/JSR+223+Scripting+with+Groovy,已经很好的解释了这一点。注意文中的最后一句话:
直接使用Groovy,不是像上文中那样去通过ScriptEngine去eval,除了方便,还让你感觉开发过程不是割裂的。只有在程序开发完成之后,有可能需要动态去改变一些东西的情况下,我才会去考虑使用这种方法。典型的如一些规则书写,完全可以使用Groovy来定义,之后保存到数据库或其他地方。使用时动态加载计算。
所以,这些全都在于你自己需要怎么去用它,而不是说单纯的只看一点。
用途写脚本测试工具,支持多脚本语言
恩,我听懂你的意思了,非常感谢你的阐释。
看了一早上的groovy api 也没看到。Groovy 脚本调用因为是很简单,很方便。这个点上它的集成的机制只实现了自己的GroovyScriptEngine,对于它的优越性,我觉得它可以去实现其他脚本机制,毕竟它也是语言。 (发牢骚) 我是这样想的。
用途写脚本测试工具,支持多脚本语言 对于这个需求,我看样子不得不回归到Java里了。你说对吗?
应该差不多吧,呵呵
应该差不多吧,呵呵