知识大全 Groovy编程动态改变对象的能力
Posted 山风
篇首语:学习是劳动,是充满思想的劳动。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Groovy编程动态改变对象的能力相关的知识,希望对你有一定的参考价值。
Groovy编程动态改变对象的能力 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
从Groovy beta 开始 实现动态改变对象的能力变的十分简单
一开始 我们有这样一个类
class Person String name
该类的实例都是哑巴 不能说话 作为造物主的我们该完善它们 使它们能自我介绍(添加实例方法)
class Person String name // 添加自我介绍的行为 taClass introduce << println I m $name
现在让我们看看 它们到底是否真的能够开口自我介绍了呢
class Person String name // 添加自我介绍的行为 taClass introduce << println I m $name def person = new Person(name: 山风小子 ) person introduce()
运行结果
I m 山风小子
嗯~人类改造成功~
但人应该有性别吧 嗯~对的 加个性别属性sex(添加属性)
class Person String name // 添加自我介绍的行为 taClass introduce << println I m $name // 添加性别属性 默认为男(Male) taClass sex = Male def person = new Person(name: 山风小子 ) person introduce() println person sex
运行结果
I m 山风小子
Male
但做男人累啊~为了买房 娶妻拼命赚钱 做女人算了 做变性手术
class Person String name // 添加自我介绍的行为 taClass introduce << println I m $name // 添加性别属性 默认为男(Male) taClass 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 // 添加自我介绍的行为 taClass introduce << println I m $name // 添加性别属性 默认为男(Male) taClass sex = Male // 修改之前自我介绍行为 添加性别说明 taClass 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 // 添加自我介绍的行为 taClass introduce << println I m $name // 添加性别属性 默认为男(Male) taClass sex = Male // 修改之前自我介绍行为 添加性别说明 taClass introduce << println I m $name $sex def person = new Person(name: 山风小子 ) person introduce() // 做变性手术 变为女的(Female) person sex = Female person introduce() // 工厂方法 造人方便点 taClass static createPerson = name sex > Person p = new Person() p name = name p sex = sex return p def bluesun = Person createPerson( 山风小子 Male ) bluesun introduce()
运行结果
I m 山风小子 Male
I m 山风小子 Female
I m 山风小子 Male
为了方便实例化Person 添加一个构造方法(添加构造方法)
class Person String name // 添加自我介绍的行为 taClass introduce << println I m $name // 添加性别属性 默认为男(Male) taClass sex = Male // 修改之前自我介绍行为 添加性别说明 taClass introduce << println I m $name $sex def person = new Person(name: 山风小子 ) person introduce() // 做变性手术 变为女的(Female) person sex = Female person introduce() // 工厂方法 造人方便点 taClass static createPerson = name sex > Person p = new Person() p name = name p sex = sex return p def bluesun = Person createPerson( 山风小子 Male ) bluesun introduce() // 方便实例化Person 添加一个构造方法 nstructor << 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)
taClass 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异常) =用于添加方法或覆蓋既有方法
而从Groovy beta 开始 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 (taClass respondsTo(daniel introduce )) daniel introduce() // 判断实例daniel是否有方法introduce(String) if (taClass respondsTo(daniel introduce String)) daniel introduce( Annie ) // 判断实例daniel是否有属性name if (taClass hasProperty(daniel name )) println daniel name
运行结果
I m Daniel
She is Annie
Daniel
使用methodMissing方法来处理对那些不存在的方法的调用
class Person String name public Person(name) this name = name def introduce() println I m $name def introduce(String name) println She is $name thodMissing = name args > // 动态添加方法 taClass $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 name public Person(name) this name = name def introduce() println I m $name def introduce(String name) println She is $name taClass propertyMissing = String name value > // 动态添加属性 taClass $name = value def daniel = new Person( Daniel ) daniel sex = Male println daniel sex
运行结果
cha138/Article/program/Java/hx/201311/26669相关参考
Groovy编程——Mixin的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 由于Java
Groovy编程用Closure替代匿名类 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 由于内
知识大全 Groovy高效编程—利用SwingBuilder构造GUI
Groovy高效编程—利用SwingBuilder构造GUI 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
知识大全 Groovy高效编程—生成Oracle表结构信息文档
Groovy高效编程—生成Oracle表结构信息文档 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
对于BDE会话期对象来说BDE别名特别重要许多方法都需要传递一个数据库的别名作为参数TSession提供了管理BDE别名的功能 但是作者往往等到要发布程序时才发现你的程序由于找不到别名而无法运行
上一次在使用Java开始面向对象的编程这篇文章中我们学习了一个编程语言要真正成为面向对象的它应该支持信息隐藏/封装多态继承和动态绑定另外我们知道了Java完全支持这些功能而且知道了因为Java是一
VB.NET的新的面向对象能力 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 面向对象的编程在V
直流锅炉是一个多输入、多输出的多变量对象。单独改变燃烧率或给水量都会对过热汽温以及蒸汽流量、功率、汽压等发生显著影响。所以,直流锅炉各子调节系统之间耦合关系密切。
直流锅炉是一个多输入、多输出的多变量对象。单独改变燃烧率或给水量都会对过热汽温以及蒸汽流量、功率、汽压等发生显著影响。所以,直流锅炉各子调节系统之间耦合关系密切。
DELPHI基础教程:动态链接库编程(一)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!