從groovy1.1beta-2開始,實現動態改變物件的能力變的十分簡單:
一開始,我們有這樣乙個類:
class person
該類的例項都是啞巴,不能說話,作為造物主的我們該完善它們,使它們能自我介紹(新增例項方法):
class person // 新增自我介紹的行為person.metaclass.introduce <<
現在讓我們看看,它們到底是否真的能夠開口自我介紹了呢:
class person // 新增自我介紹的行為
person.metaclass.introduce <<
def person = new person(name:"山風小子")
person.introduce()
執行結果:
i'm 山風小子
嗯~人類改造成功~
但人應該有性別吧,嗯~對的,加個性別屬性***(新增屬性):
class person // 新增自我介紹的行為person.metaclass.introduce <<
// 新增性別屬性,預設為男(male)
person.metaclass.*** = "male"
def person = new person(name:"山風小子")
person.introduce()
println person.***
執行結果:
i'm 山風小子
male
但做男人累啊~為了買房,娶妻拼命賺錢,做女人算了,做變性手術:
class person // 新增自我介紹的行為person.metaclass.introduce <<
// 新增性別屬性,預設為男(male)
person.metaclass.*** = "male"
def person = new person(name:"山風小子")
person.introduce()
println person.***
// 做變性手術,變為女的(female)
person.*** = "female"
println person.***
執行結果:
i'm 山風小子
male
female
作為造物主的我們考慮到手術的風險性,為了讓其他人知道自己現在是個女的,在介紹中新增性別說明:
class person // 新增自我介紹的行為person.metaclass.introduce <<
// 新增性別屬性,預設為男(male)
person.metaclass.*** = "male"
// 修改之前自我介紹行為,新增性別說明
person.metaclass.introduce <<
def person = new person(name:"山風小子")
person.introduce()
// 做變性手術,變為女的(female)
person.*** = "female"
person.introduce()
執行結果:
i'm 山風小子, male
i'm 山風小子, female
為了造人方便點,搞個工廠方法(新增類方法,即靜態方法):
class person// 新增自我介紹的行為
person.metaclass.introduce <<
// 新增性別屬性,預設為男(male)
person.metaclass.*** = "male"
// 修改之前自我介紹行為,新增性別說明
person.metaclass.introduce <<
def person = new person(name:"山風小子")
person.introduce()
// 做變性手術,變為女的(female)
person.*** = "female"
person.introduce()
// 工廠方法,造人方便點
person.metaclass.'static'.createperson =
def bluesun = person.createperson("山風小子", "male")
bluesun.introduce()
執行結果:
i'm 山風小子, male
i'm 山風小子, female
i'm 山風小子, male
為了方便例項化person,新增乙個構造方法(新增構造方法):
class person// 新增自我介紹的行為
person.metaclass.introduce <<
// 新增性別屬性,預設為男(male)
person.metaclass.*** = "male"
// 修改之前自我介紹行為,新增性別說明
person.metaclass.introduce <<
def person = new person(name:"山風小子")
person.introduce()
// 做變性手術,變為女的(female)
person.*** = "female"
person.introduce()
// 工廠方法,造人方便點
person.metaclass.'static'.createperson =
def bluesun = person.createperson("山風小子", "male")
bluesun.introduce()
// 方便例項化person,新增乙個構造方法
person.metaclass.constructor <<
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 =sb.tostring()
}string s = "hello, world!"
println s.swapcase()
執行結果:
hello, world!
《用於新增方法(如果方法已經存在,會發生groovy.lang.groovyruntimeexception異常),=用於新增方法或覆蓋既有方法
GINA之Groovy的MOP動態特性
gina groovy in action groovy中metaclass在其動態特性中有著舉足輕重的作用,uml類圖如下 img gia中groovy方法呼叫描述如下 list 1 呼叫當前類的invokemethod方法實現 當然也可能是 傳遞給metaclass 呼叫getmetaclass...
高效程式設計的秘訣
昨天我做了一些事情使我的程式設計效率提高了一倍。簡單,容易,但使我的生活發生了巨大的變化。你們中可能有些人已經知道我是怎麼做的。對於其他的人,這聽起來有些瘋狂。我不持續工作。或者,我把定時器設定成50分鐘,在此期間我只幹一件事 沒email,沒聊天工具,沒遊戲,沒分心的事。50分鐘後,我去散步。它使...
動態改變 如何動態改變報表的行高列寬
報表應用中有時需要動態控制行高或列寬以滿足特定需要。如分組報表中要求每個分組的總高度 寬度固定不變,這樣一來就能實現每頁紙列印相同數量的分組。潤幹報表可以在行高列寬屬性中編寫表示式,從而實現動態行高列寬,下面通過乙個例子說明使用過程。使用潤幹報表設計器,連線自帶資料來源 demo 新建報表並設定資料...