Groovy高效编程——动态改变对象的能力
http://tech.ddvip.com 2008年01月22日 社区交流
内容摘要:从Groovy1.1beta-2开始,实现动态改变对象的能力变的十分简单。而从Groovy1.1beta-3开始,Groovy的动态性有了进一步的增强。
String.metaClass.swapCase = {->
def sb = new StringBuffer()
// delegate与this类似,引用当前正被‘改造’的对象
delegate.each {
sb << (Character.isUpperCase(it as char) ? Character.toLowerCase(it as char) :
Character.toUpperCase(it as char))
}
sb.toString()
}
String s = "Hello, world!"
println s.swapCase()
运行结果:
hELLO, WORLD!
<<用于添加方法(如果方法已经存在,会发生groovy.lang.GroovyRuntimeException异常),=用于添加方法或覆盖既有方法
而从Groovy1.1beta-3开始,Groovy的动态性有了进一步的增强:
我们可以通过respondsTo和hasProperty方法来判断是否存在某个方法和某个属性:
class Person {
String name
public Person(name) {
this.name = name
}
def introduce() {
println "I'm $name"
}
def introduce(String name) {
println "She is $name"
}
}
def daniel = new Person('Daniel')
// 判断实例daniel是否有方法introduce()
if (daniel.metaClass.respondsTo(daniel, 'introduce')) {
daniel.introduce()
}
// 判断实例daniel是否有方法introduce(String)
if (daniel.metaClass.respondsTo(daniel, 'introduce', String)) {
daniel.introduce('Annie')
}
// 判断实例daniel是否有属性name
if (daniel.metaClass.hasProperty(daniel, 'name')) {
println daniel.name
}
运行结果:
作者:山风小子 责编:豆豆技术应用