【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )

简介: 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )

一、同时注入普通方法、静态方法、构造方法


如果要同时为 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

image.png

image.png

目录
相关文章
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )
134 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )
139 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入普通方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入普通方法 )
142 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入普通方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
148 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
168 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Mixin 混合进行方法注入 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Mixin 混合进行方法注入 )
142 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Mixin 混合进行方法注入 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )
174 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 使用 @Delegate 注解进行方法委托 )
【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 使用 @Delegate 注解进行方法委托 )
158 0
【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 使用 @Delegate 注解进行方法委托 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )
187 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
147 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )