一、同时注入普通方法、静态方法、构造方法
如果要同时为 Groovy 类注入大量方法 , 使用 Category 分类 或 MetaClass 将每个方法逐个注入 , 这样操作比较繁琐 ;
同时为 Groovy 类注入多个方法 , 可以使用 metaClass 方法实现 , 该函数的原型如下 :
public static MetaClass metaClass(Class self, Closure closure) { MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry(); MetaClass mc = metaClassRegistry.getMetaClass(self); if (mc instanceof ExpandoMetaClass) { ((ExpandoMetaClass)mc).define(closure); return mc; } else if (mc instanceof DelegatingMetaClass && ((DelegatingMetaClass)mc).getAdaptee() instanceof ExpandoMetaClass) { ((ExpandoMetaClass)((DelegatingMetaClass)mc).getAdaptee()).define(closure); return mc; } else if (mc instanceof DelegatingMetaClass && ((DelegatingMetaClass)mc).getAdaptee().getClass() == MetaClassImpl.class) { ExpandoMetaClass emc = new ExpandoMetaClass(self, false, true); emc.initialize(); emc.define(closure); ((DelegatingMetaClass)mc).setAdaptee(emc); return mc; } else if (mc.getClass() == MetaClassImpl.class) { MetaClass mc = new ExpandoMetaClass(self, false, true); mc.initialize(); ((ExpandoMetaClass)mc).define(closure); metaClassRegistry.setMetaClass(self, mc); return mc; } else { throw new GroovyRuntimeException("Can't add methods to custom meta class " + mc); } }
使用规则如下 :
类名.mateClass { // 注入普通方法 普通方法名 = {闭包} // 注入静态方法 'static' { 静态方法名 = {闭包} } // 注入构造方法 constructor = { 构造方法参数列表 -> 构造方法内容 要返回的实例对象 } }
为下面的 Student 类 , 同时注入 普通方法、静态方法、构造方法 ;
class Student { def name; }
注入方法如下 :
// 注入多个类型的方法 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) } }
二、完整代码示例
完整代码示例 :
class Student { def name; } // 注入多个类型的方法 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) } } // 调用注入的静态方法 Student.fun() // 使用注入的构造方法初始化 Student 类 def student = new Student("Tom") // 调用注入的普通方法 student.hello() student.say()
执行结果 :
Class Type : class Student Hello Tom My name is Tom