Groovy高效编程——动态改变对象的能力
来源:互联网 发布:2016奥运会网络转播权 编辑:程序博客网 时间:2024/04/29 12:55
从Groovy1.1beta-2开始,实现动态改变对象的能力变的十分简单:
一开始,我们有这样一个类:
class Person { String name } |
该类的实例都是哑巴,不能说话,作为造物主的我们该完善它们,使它们能自我介绍(添加实例方法):
class Person {String name}// 添加自我介绍的行为Person.metaClass.introduce << {println "I'm $name"} |
现在让我们看看,它们到底是否真的能够开口自我介绍了呢:
class Person { String name }// 添加自我介绍的行为 Person.metaClass.introduce << {println "I'm $name"} def person = new Person(name:"山风小子") person.introduce() |
运行结果:
I'm 山风小子
嗯~人类改造成功~
但人应该有性别吧,嗯~对的,加个性别属性sex(添加属性):
class Person {String name}// 添加自我介绍的行为Person.metaClass.introduce << {println "I'm $name"}// 添加性别属性,默认为男(Male)Person.metaClass.sex = "Male"def person = new Person(name:"山风小子")person.introduce()println person.sex |
运行结果:
I'm 山风小子
Male
但做男人累啊~为了买房,娶妻拼命赚钱,做女人算了,做变性手术:
class Person {String name}// 添加自我介绍的行为Person.metaClass.introduce << {println "I'm $name"}// 添加性别属性,默认为男(Male)Person.metaClass.sex = "Male"def person = new Person(name:"山风小子")person.introduce()println person.sex// 做变性手术,变为女的(Female)person.sex = "Female"println person.sex |
运行结果:
I'm 山风小子
Male
Female作为造物主的我们考虑到手术的风险性,为了让其他人知道自己现在是个女的,在介绍中添加性别说明:
class Person {String name}// 添加自我介绍的行为Person.metaClass.introduce << {println "I'm $name"}// 添加性别属性,默认为男(Male)Person.metaClass.sex = "Male"// 修改之前自我介绍行为,添加性别说明Person.metaClass.introduce << {println "I'm $name, $sex"}def person = new Person(name:"山风小子")person.introduce()// 做变性手术,变为女的(Female)person.sex = "Female"person.introduce() |
运行结果:
I'm 山风小子, Male
I'm 山风小子, Female为了造人方便点,搞个工厂方法(添加类方法,即静态方法):
class Person {String name}// 添加自我介绍的行为Person.metaClass.introduce << {println "I'm $name"}// 添加性别属性,默认为男(Male)Person.metaClass.sex = "Male"// 修改之前自我介绍行为,添加性别说明Person.metaClass.introduce << {println "I'm $name, $sex"}def person = new Person(name:"山风小子")person.introduce()// 做变性手术,变为女的(Female)person.sex = "Female"person.introduce()// 工厂方法,造人方便点Person.metaClass.'static'.createPerson = { name, sex ->Person p = new Person()p.name = namep.sex = sexreturn p}def bluesun = Person.createPerson("山风小子", "Male")bluesun.introduce() |
运行结果:
I'm 山风小子, Male
I'm 山风小子, Female
I'm 山风小子, Male
为了方便实例化Person,添加一个构造方法(添加构造方法):
class Person {String name}// 添加自我介绍的行为Person.metaClass.introduce << {println "I'm $name"}// 添加性别属性,默认为男(Male)Person.metaClass.sex = "Male"// 修改之前自我介绍行为,添加性别说明Person.metaClass.introduce << {println "I'm $name, $sex"}def person = new Person(name:"山风小子")person.introduce()// 做变性手术,变为女的(Female)person.sex = "Female"person.introduce()// 工厂方法,造人方便点Person.metaClass.'static'.createPerson = { name, sex ->Person p = new Person()p.name = namep.sex = sexreturn p}def bluesun = Person.createPerson("山风小子", "Male")bluesun.introduce()// 方便实例化Person,添加一个构造方法Person.metaClass.constructor << { name, sex ->new Person(name:name, sex:sex)}def daniel = new Person("Daniel", "Male")daniel.introduce() |
运行结果:
I'm 山风小子, Male
I'm 山风小子, Female
I'm 山风小子, Male
I'm Daniel, Male
最后,引用一个官方例子swapCase来展示一下Groovy是如何增强既有类的能力的(演示如何使用delegate,注意演示的是final类:String)
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 namepublic Person(name) {this.name = name} |
运行结果:
I'm Daniel
She is Annie
Daniel
使用methodMissing方法来处理对那些不存在的方法的调用
class Person {String namepublic Person(name) {this.name = name} |
运行结果:
{"Leona"}
No method hi with [class java.lang.String, class java.lang.String]
类似地,使用propertyMissing方法来处理对那些不存在的属性的引用
class Person {String namepublic Person(name) {this.name = name} |
运行结果:
Male
- Groovy高效编程——动态改变对象的能力
- Groovy高效编程——动态改变对象的能力
- Groovy高效编程——动态改变对象的能力(1)
- Groovy高效编程——动态改变对象的能力(2)
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——创建DSL
- Groovy高效编程——‘匕首方法'
- groovy元编程 方法拦截 动态改变
- Groovy高效编程——统计单词频率
- Groovy高效编程——生成XML文件
- Groovy高效编程——‘匕首方法’的使用(更新于2007.09.14)(转载)
- Groovy高效编程——用Groovy轻松搞定SOAP消息
- 程序员必备,程序员四大忌
- Groovy全攻略--运行篇
- Websharp 10 - Websharp Framework
- Linux文件系统概述 [转]
- 关于linux图形界面的基本知识[转贴,新手必读]- -
- Groovy高效编程——动态改变对象的能力
- Groovy高效编程——‘匕首方法’的使用
- Groovy轻松入门——搭建Groovy开发环境
- 狙击电话亭---面对上帝的拷问,不是不报时候未到。
- RIA体验,谁的体验?
- 关于集电极开路(OC)或漏极开路(OD)输出的结构
- 我的四季(张洁)
- test
- JavaScript中的call和apply