前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )

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

作者头像
韩曙亮
发布2023-03-30 10:58:37
1490
发布2023-03-30 10:58:37
举报

文章目录

一、分析使用 MetaClass 进行方法注入前后 mateClass 类型变化


打印下面 Student 类 的 metaClass ,

代码语言:javascript
复制
class Student {
    def name;
}

println Student.metaClass

打印结果如下 :

代码语言:javascript
复制
org.codehaus.groovy.runtime.HandleMetaClass@3745e5c6[groovy.lang.MetaClassImpl@3745e5c6[class Student]]

使用 metaClass 向 Student类中 , 注入了多个方法 ,

代码语言:javascript
复制
// 注入多个类型的方法
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 内容 , 打印结果变成了

代码语言:javascript
复制
groovy.lang.ExpandoMetaClass@41e36e46[class Student]

方法注入前 , 类的 metaClass 类型为 org.codehaus.groovy.runtime.HandleMetaClass , 方法注入后 , 类的 metaClass 的类型变为了 groovy.lang.ExpandoMetaClass ;

使用 MetaClass 进行方法注入 , 是通过将 metaClass 替换为 groovy.lang.ExpandoMetaClass 对象实现的 ;

二、完整代码示例


完整代码示例 :

代码语言:javascript
复制
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()

执行结果 :

代码语言:javascript
复制
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
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、分析使用 MetaClass 进行方法注入前后 mateClass 类型变化
  • 二、完整代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档