熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Groovy編程動態改變對象的能力

2013-11-23 19:19:36  來源: Java核心技術 

  從Groovybeta開始實現動態改變對象的能力變的十分簡單

  一開始我們有這樣一個類


    class Person {   String name   }

  該類的實例都是啞巴不能說話作為造物主的我們該完善它們使它們能自我介紹(添加實例方法)


    class Person {   String name   }   // 添加自我介紹的行為   taClassintroduce << {println Im $name}

  現在讓我們看看它們到底是否真的能夠開口自我介紹了呢


    class Person {   String name   }   // 添加自我介紹的行為   taClassintroduce << {println Im $name}   def person = new Person(name:山風小子)   personintroduce()

  運行結果

  Im 山風小子

  嗯~人類改造成功~

  但人應該有性別吧嗯~對的加個性別屬性sex(添加屬性)


    class Person {   String name   }   // 添加自我介紹的行為   taClassintroduce << {println Im $name}   // 添加性別屬性默認為男(Male)   taClasssex = Male   def person = new Person(name:山風小子)   personintroduce()   println personsex

  運行結果

  Im 山風小子

  Male

  但做男人累啊~為了買房娶妻拼命賺錢做女人算了做變性手術


    class Person {   String name   }   // 添加自我介紹的行為   taClassintroduce << {println Im $name}   // 添加性別屬性默認為男(Male)   taClasssex = Male   def person = new Person(name:山風小子)   personintroduce()   println personsex   // 做變性手術變為女的(Female)   personsex = Female   println personsex

  運行結果

  Im 山風小子

  Male

  Female

  作為造物主的我們考慮到手術的風險性為了讓其他人知道自己現在是個女的在介紹中添加性別說明


    class Person {   String name   }   // 添加自我介紹的行為   taClassintroduce << {println Im $name}   // 添加性別屬性默認為男(Male)   taClasssex = Male   // 修改之前自我介紹行為添加性別說明   taClassintroduce << {println Im $name $sex}   def person = new Person(name:山風小子)   personintroduce()   // 做變性手術變為女的(Female)   personsex = Female   personintroduce()

  運行結果

  Im 山風小子 Male

  Im 山風小子 Female

  為了造人方便點搞個工廠方法(添加類方法即靜態方法)


    class Person {   String name   }   // 添加自我介紹的行為   taClassintroduce << {println Im $name}   // 添加性別屬性默認為男(Male)   taClasssex = Male   // 修改之前自我介紹行為添加性別說明   taClassintroduce << {println Im $name $sex}   def person = new Person(name:山風小子)   personintroduce()   // 做變性手術變為女的(Female)   personsex = Female   personintroduce()   // 工廠方法造人方便點   taClassstaticcreatePerson = { name sex >   Person p = new Person()   pname = name   psex = sex   return p   }   def bluesun = PersoncreatePerson(山風小子 Male)   bluesunintroduce()

  運行結果

  Im 山風小子 Male

  Im 山風小子 Female

  Im 山風小子 Male

  為了方便實例化Person添加一個構造方法(添加構造方法)


    class Person {   String name   }   // 添加自我介紹的行為   taClassintroduce << {println Im $name}   // 添加性別屬性默認為男(Male)   taClasssex = Male   // 修改之前自我介紹行為添加性別說明   taClassintroduce << {println Im $name $sex}   def person = new Person(name:山風小子)   personintroduce()   // 做變性手術變為女的(Female)   personsex = Female   personintroduce()   // 工廠方法造人方便點   taClassstaticcreatePerson = { name sex >   Person p = new Person()   pname = name   psex = sex   return p   }   def bluesun = PersoncreatePerson(山風小子 Male)   bluesunintroduce()   // 方便實例化Person添加一個構造方法   nstructor << { name sex >   new Person(name:name sex:sex)   }   def daniel = new Person(Daniel Male)   danielintroduce()

  運行結果

  Im 山風小子 Male

  Im 山風小子 Female

  Im 山風小子 Male

  Im Daniel Male

  最後引用一個官方例子swapCase來展示一下Groovy是如何增強既有類的能力的(演示如何使用delegate注意演示的是final類String)


    taClassswapCase = {>   def sb = new StringBuffer()   // delegate與this類似引用當前正被改造的對象   delegateeach {   sb << (CharacterisUpperCase(it as char) ? CharactertoLowerCase(it as char) :   CharactertoUpperCase(it as char))   }   sbtoString()   }   String s = Hello world!   println sswapCase()

  運行結果

  hELLO WORLD!

  <<用於添加方法(如果方法已經存在會發生groovylangGroovyRuntimeException異常)=用於添加方法或覆蓋既有方法

  而從Groovybeta開始Groovy的動態性有了進一步的增強

  我們可以通過respondsTo和hasProperty方法來判斷是否存在某個方法和某個屬性


    class Person {   String name   public Person(name) {   thisname = name   }   def introduce() {   println Im $name   }   def introduce(String name) {   println She is $name   }   }   def daniel = new Person(Daniel)   // 判斷實例daniel是否有方法introduce()   if (taClassrespondsTo(daniel introduce)) {   danielintroduce()   }   // 判斷實例daniel是否有方法introduce(String)   if (taClassrespondsTo(daniel introduce String)) {   danielintroduce(Annie)   }   // 判斷實例daniel是否有屬性name   if (taClasshasProperty(daniel name)) {   println danielname   }

  運行結果

  Im Daniel

  She is Annie

  Daniel

  使用methodMissing方法來處理對那些不存在的方法的調用


    class Person {   String name   public Person(name) {   thisname = name   }   def introduce() {   println Im $name   }   def introduce(String name) {   println She is $name   }   }   thodMissing = { name args >   // 動態添加方法   taClass$name = { methodArgs >   if (helloequals(name))   println $methodArgs   else {   def argList = ArraysasList(methodArgs)   println No method $name with ${argList*class}   }   }   delegate$name(args)   }   def daniel = new Person(Daniel)   danielhello(Leona)   danielhi(Annie Leona)

  運行結果

  {Leona}

  No method hi with [class javalangString class javalangString]

  類似地使用propertyMissing方法來處理對那些不存在的屬性的引用


    class Person {   String name   public Person(name) {   thisname = name   }   def introduce() {   println Im $name   }   def introduce(String name) {   println She is $name   }   }   taClasspropertyMissing = { String name value >   // 動態添加屬性   taClass$name = value   }   def daniel = new Person(Daniel)   danielsex = Male   println danielsex

  運行結果

  Male


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26669.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.