一、分析使用 MetaClass 进行方法注入前后 mateClass 类型变化
打印下面 Student 类 的 metaClass ,
class Student { def name; } println Student.metaClass
打印结果如下 :
org.codehaus.groovy.runtime.HandleMetaClass@3745e5c6[groovy.lang.MetaClassImpl@3745e5c6[class Student]]
使用 metaClass 向 Student类中 , 注入了多个方法 ,
// 注入多个类型的方法 Student.metaClass { // 注入普通方法 hello = { println "Hello ${delegate.name}" } // 注入普通方法 say = { println "My name is ${delegate.name}" } // 注入静态方法 'static' { fun = { println "Class Type : ${delegate}" } } // 注入构造方法 constructor = { String str -> new Student(name: str) } }
注入之后 , 再次使用 println Student.metaClass 打印 Student.metaClass 内容 , 打印结果变成了
groovy.lang.ExpandoMetaClass@41e36e46[class Student]
方法注入前 , 类的 metaClass 类型为 org.codehaus.groovy.runtime.HandleMetaClass , 方法注入后 , 类的 metaClass 的类型变为了 groovy.lang.ExpandoMetaClass ;
使用 MetaClass 进行方法注入 , 是通过将 metaClass 替换为 groovy.lang.ExpandoMetaClass 对象实现的 ;
二、完整代码示例
完整代码示例 :
class Student { def name; } println Student.metaClass // 注入多个类型的方法 Student.metaClass { // 注入普通方法 hello = { println "Hello ${delegate.name}" } // 注入普通方法 say = { println "My name is ${delegate.name}" } // 注入静态方法 'static' { fun = { println "Class Type : ${delegate}" } } // 注入构造方法 constructor = { String str -> new Student(name: str) } } println Student.metaClass // 调用注入的静态方法 Student.fun() // 使用注入的构造方法初始化 Student 类 def student = new Student("Tom") // 调用注入的普通方法 student.hello() student.say()
执行结果 :
org.codehaus.groovy.runtime.HandleMetaClass@3745e5c6[groovy.lang.MetaClassImpl@3745e5c6[class Student]] groovy.lang.ExpandoMetaClass@7c0c77c7[class Student] Class Type : class Student Hello Tom My name is Tom