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 进行方法注入构造方法 )

GroovyMOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )