GroovyMOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法静态方法构造方法 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GroovyMOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法静态方法构造方法 )相关的知识,希望对你有一定的参考价值。
文章目录
一、同时注入普通方法、静态方法、构造方法
如果要同时为 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
以上是关于GroovyMOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法静态方法构造方法 )的主要内容,如果未能解决你的问题,请参考以下文章
GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )
GroovyMOP 元对象协议与元编程 ( 方法合成引入 | 类内部获取 HandleMetaClass )
GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )