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

来源:互联网 发布:h3c网管软件 编辑:程序博客网 时间:2024/05/16 03:00
// 类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 = emcprintln 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 = nulltry {    jack.play() // 预先定义的方法(非注入的方法),仍然可以使用    jack.sing() // 已经注销,再调用报异常} catch (e) {    println e}

阅读全文
0 0
原创粉丝点击