Groovy高效程式設計 動態改變物件的能力 1

2021-04-24 14:58:02 字數 3515 閱讀 7603

從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 新建報表並設定資料...