您的位置:首页 > 其它

13.3Groovy向具体的实例(对象)中注入方法,使不同的对象有不同的方法(神奇不)

2017-11-22 11:14 267 查看
// 类
class Person {
def play() { println 'playing...' }
}

// 创建个EMC实例
def emc = new ExpandoMetaClass(Person)
// 注入到EMC实例
emc.sing = { ->
'on baby baby...'
}
// 初始化EMC实例
emc.initialize()

def jack = new Person() // 杰克
def paul = new Person() // 保罗

// 注入对象的方法(每个对象都有MetaClass)
jack.metaClass = emc

println jack.sing()

try {
paul.sing() //保罗没有此方法
} catch (e) {
println e
}

运行结果:

on baby baby...

groovy.lang.MissingMethodException: No signature of method: learn.Person.sing() is applicable for argument types: () values: []

Possible solutions: find(), find(groovy.lang.Closure), is(java.lang.Object), any(), any(groovy.lang.Closure), print(java.lang.Object)

有简单的实现方法,不用创建EMC实例,直接在对象的MetaClass上扩展方法。结果一样。

// 类
class Person {
def play() { println 'playing...' }
}

def jack = new Person() // 杰克
def paul = new Person() // 保罗

// 注入方法
jack.metaClass.sing = { ->
'oh baby baby...'
}

println jack.sing()

try {
println paul.sing() // 保罗无此方法
} catch (e) {
println e
}

// 注销方法
jack.metaClass = null

try {
jack.play() // 预先定义的方法(非注入的方法),仍然可以使用
jack.sing() // 已经注销,再调用报异常
} catch (e) {
println e
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: