而从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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。