從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