知识大全 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的使用

Groovy编程——Mixin的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  由于Java

知识大全 Groovy编程用Closure替代匿名类

Groovy编程用Closure替代匿名类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  由于内

知识大全 Groovy高效编程—利用SwingBuilder构造GUI

Groovy高效编程—利用SwingBuilder构造GUI  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 Groovy高效编程—生成Oracle表结构信息文档

Groovy高效编程—生成Oracle表结构信息文档  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 delphi编程实现动态创建别名

  对于BDE会话期对象来说BDE别名特别重要许多方法都需要传递一个数据库的别名作为参数TSession提供了管理BDE别名的功能  但是作者往往等到要发布程序时才发现你的程序由于找不到别名而无法运行

知识大全 面向对象思想之 -- 理解类和对象

  上一次在使用Java开始面向对象的编程这篇文章中我们学习了一个编程语言要真正成为面向对象的它应该支持信息隐藏/封装多态继承和动态绑定另外我们知道了Java完全支持这些功能而且知道了因为Java是一

知识大全 VB.NET的新的面向对象能力

VB.NET的新的面向对象能力  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  面向对象的编程在V

直流锅炉的动态特性是什么?

  直流锅炉是一个多输入、多输出的多变量对象。单独改变燃烧率或给水量都会对过热汽温以及蒸汽流量、功率、汽压等发生显著影响。所以,直流锅炉各子调节系统之间耦合关系密切。

直流锅炉的动态特性是什么?

  直流锅炉是一个多输入、多输出的多变量对象。单独改变燃烧率或给水量都会对过热汽温以及蒸汽流量、功率、汽压等发生显著影响。所以,直流锅炉各子调节系统之间耦合关系密切。

知识大全 动态链接库编程(一)[4]

DELPHI基础教程:动态链接库编程(一)[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!