GroovyMOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GroovyMOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )相关的知识,希望对你有一定的参考价值。

文章目录





一、分析使用 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

以上是关于GroovyMOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )的主要内容,如果未能解决你的问题,请参考以下文章

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )

GroovyMOP 元对象协议与元编程 ( 方法合成引入 | 类内部获取 HandleMetaClass )

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )

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

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