Groovy 1.5的新特性
http://tech.ddvip.com 2008年01月22日 社区交流
内容摘要:Groovy,针对JVM的类Java动态语言,主要增强了对于Java 5特征的支持,包括注解、泛型和枚举,框架包括Spring,Hibernate,JPA,Goole Guice或者TestNG。
Groovy是一个动态语言:简单的说,这意味着某些事情,例如方法分派发生在运行时,而不是象Java和其他语言那样发生在编译时。在Groovy中有一个特殊的运行时系统,叫做MOP(元对象协议Meta-Object Protocol),负责方法分派逻辑。幸运的是,这个运行时系统非常开放,人们可以深入系统并且改变系统的通常行为。对于每一个Java类和每一个Groovy实例,都有一个与之相关联的元类(meta-class)代表该对象的运行时行为。Groovy为你与MOP交互提供了几种不同的方法,可以定制元类,可以继承某些基类,但是谢谢Grails项目的贡献,有一种更groovy的元类:expando元类。
代码例子可以帮助我们更容易地理解概念。在下面的例子中,字符串msg的实例有一个元类,我们可以通过metaClass属性访问该元类。然后我们改变String类的元类,为其增加一个新方法,为toUpperCase()方法提供一个速记记法。之后,我们为元类的up属性分配一个闭包,这个属性是在我们把闭包分配给它的时候创建的。这个闭包没有参数(因此它以一个箭头开始),我们在闭包的委托之上调用toUpperCase()方法,这个委托是一个特殊的闭包变量,代表着真实的对象(这里是String实例)。
def msg = "Hello!"
println msg.metaClass
String.metaClass.up = { -> delegate.toUpperCase() }
assert "HELLO!" == msg.up()
通过这个元类,你可以查询对象有哪些方法或者属性:
// print all the methods
obj.metaClass.methods.each { println it.name }
// print all the properties
obj.metaClass.properties.each { println it.name }
你甚至可以检查某个特定的方法或者属性是否可用,比使用instanceof来检查的粒度要小的多:
来源:InfoQ中文站 作者:曹云飞 责编:豆豆技术应用