我们可以动态地向Groovy中的类添加新的行为,比如方法。 所以这意味着一个方法不会添加到源代码中的类定义中,而是添加到应用程序已经运行的类定义中。 为此,Groovy为所有类添加了一个metaClass
属性。 这个属性的类型是ExpandoMetaClass
。 我们可以将方法(也是静态的),属性,构造函数分配给metaClass
属性,并将定义的行为动态添加到类定义中。 在我们添加了行为之后,我们可以创建类的新实例并调用方法,构造函数并像以前一样访问属性。
//我们将方法rightShift添加到List类。
//实现只是调用List的remove方法
//提供的参数。
List.metaClass.rightShift {
delegate.remove it
}
def list = ['one', 'two', 'three', 'four']
assert 4 == list.size()
list.rightShift 'two'
assert 3 == list.size()
assert ['one', 'three', 'four'] == list
// Operator overloading in action: rightShift is >>
list >> 'one'
assert 2 == list.size()
assert ['three', 'four'] == list
//我们还可以向特定实例而不是类添加行为。
//注意我们使用实例列表而不是类List来分配
//方法groovy到metaClass属性。
list.metaClass.groovy {
delegate.collect { it + ' groovy' }
}
assert ['three groovy', 'four groovy'] == list.groovy()
def newList = ['a', 'b']
try {
newList.groovy() // groovy method was added to list instance not List class.
assert false
} catch (e) {
assert e instanceof MissingMethodException
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。