而从Groovy1.1beta-3开始,Groovy的动态性有了进一步的增强:
我们可以通过respondsTo和hasProperty方法来判断是否存在某个方法和某个属性:
class Person { String namepublic 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 }
|
运行结果:
I'm Daniel
She is Annie
Daniel
使用methodMissing方法来处理对那些不存在的方法的调用
class Person { String namepublic Person(name) { this.name = name } def introduce() { println "I'm $name" } def introduce(String name) { println "She is $name" } } Person.metaClass.methodMissing = { name, args -> // 动态添加方法 Person.metaClass."$name" = { methodArgs -> if ("hello".equals(name)) println "$methodArgs" else { def argList = Arrays.asList(methodArgs) println "No method $name with ${argList*.class}" } } delegate."$name"(args) } def daniel = new Person('Daniel') daniel.hello("Leona") daniel.hi("Annie", "Leona") |
运行结果:
{"Leona"}
No method hi with [class java.lang.String, class java.lang.String]
类似地,使用propertyMissing方法来处理对那些不存在的属性的引用
class Person { String namepublic Person(name) { this.name = name } def introduce() { println "I'm $name" } def introduce(String name) { println "She is $name" } } Person.metaClass.propertyMissing = { String name, value -> // 动态添加属性 Person.metaClass."$name" = value } def daniel = new Person('Daniel') daniel.sex = 'Male' println daniel.sex |
运行结果:
Male