) { ((ExpandoMetaClass)mc).define(closure); return mc; } else if (mc instanceof DelegatingMetaClass && ((DelegatingMetaClass)mc).getAdaptee() instanceof ExpandoMetaClass) { ((ExpandoMetaClass)((DelegatingMetaClass)mc).getAdaptee()).define(closure); emc = new ExpandoMetaClass(self, false, true); emc.initialize(); emc.define( (self, false, true); mc.initialize(); ((ExpandoMetaClass)mc).define(closure);
文章目录 一、使用 ExpandoMetaClass 进行方法注入 三、完整代码示例 一、使用 ExpandoMetaClass 进行方法注入 ---- 在 【Groovy】MOP 元对象协议与元编程 ExpandoMetaClass 实例对象 ; def expandoMetaClass = new ExpandoMetaClass(Student) 然后 , 为其注入方法 , 可以注入 普通方法 } // 为 expandoMetaClass 注入静态方法 expandoMetaClass.' 注入方法 def expandoMetaClass = new ExpandoMetaClass(Student) // 为 expandoMetaClass 注入普通方法 expandoMetaClass.hello println "My name is ${delegate.name}" } // 为 expandoMetaClass 注入静态方法 expandoMetaClass.'
使用ExpandoMetaClass动态地向类添加方法 我们可以动态地向Groovy中的类添加新的行为,比如方法。 这个属性的类型是ExpandoMetaClass。 我们可以将方法(也是静态的),属性,构造函数分配给metaClass属性,并将定义的行为动态添加到类定义中。
name: str) } } 注入之后 , 再次使用 println Student.metaClass 打印 Student.metaClass 内容 , 打印结果变成了 groovy.lang.ExpandoMetaClass metaClass 类型为 org.codehaus.groovy.runtime.HandleMetaClass , 方法注入后 , 类的 metaClass 的类型变为了 groovy.lang.ExpandoMetaClass ; 使用 MetaClass 进行方法注入 , 是通过将 metaClass 替换为 groovy.lang.ExpandoMetaClass 对象实现的 ; 二、完整代码示例 ---- 完整代码示例 org.codehaus.groovy.runtime.HandleMetaClass@3745e5c6[groovy.lang.MetaClassImpl@3745e5c6[class Student]] groovy.lang.ExpandoMetaClass
Person.createStaticPerson('yif',44) println person3.name + " and "+person3.age ExpandoMetaClass.enableGlobally 模拟应用管理类 */ class ApplicationManager { static void init(){ //将外部注入的属性与方法设置为全局可用 ExpandoMetaClass.enableGlobally
* 这允许开发人员使用闭包本身的ExpandoMetaClass覆盖getProperty。
* 请注意,总是首先查找局部变量,与解析策略无关。