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 }
相关文章推荐
- JS创建对象几种不同方法具体解释
- java 多态对象 封装方法 再调用 实例:学校有不同班的学生
- 不同List中的值放入对象的方法实例
- 具体的一个实例,展示如何访问实例变量和调用成员方法
- 实例说明java中覆盖静态方法和非静态方法的不同
- java通过反射Class实例调用对象方法
- Python中的对象,方法,类,实例,函数用法分析
- php实例化一个对象时通过构造方法传参
- .Net反射技术应用解决对象不同版本方法不同参数的问题
- JavaScript 对象的属性和方法4种不同的类型
- Java 中静态方法 实例方法 具体方法区别与联系
- 微软企业库4.1学习笔记(五)对象创建和依赖注入方法
- JS获得一个对象的所有属性和方法实例
- 关于未将对象引用设置到对象实例简单原理分析,与解决方法
- hibernate 不同查询方法实例
- Android应用:Service开发实例(三)之Service的具体应用方法
- jQuery源码学习之三 (jQUery对象的实例属性和方法)
- 类方法,实例方法,对象方法,静态方法,动态方法
- mybatis从dao传入多个参数到sqlmap时dao中要使用map或实例对象(如:user)作为参数传入, 否则报错找不到属性getter方法
- 今天发现c#中的实例后的对象是不能调用静态方法,以前学Java的时候是可以的.