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

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

作者头像
韩曙亮
发布2023-03-30 10:58:56
2260
发布2023-03-30 10:58:56
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、使用 ExpandoMetaClass 进行方法注入


【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 ) 博客中 , 使用 MetaClass 注入 普通方法、静态方法、构造方法 , 其底层原理就是通过 ExpandoMetaClass 进行方法注入 ;

我们也可以自己手动实现 ExpandoMetaClass 方法注入过程 ;

如为下面的 Student 类注入方法 ;

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

首先 , 创建 ExpandoMetaClass 实例对象 ;

代码语言:javascript
复制
def expandoMetaClass = new ExpandoMetaClass(Student)

然后 , 为其注入方法 , 可以注入 普通方法、静态方法、构造方法 ;

代码语言:javascript
复制
// 为 expandoMetaClass 注入普通方法
expandoMetaClass.hello = {
    println "Hello ${delegate.name}"
}

// 为 expandoMetaClass 注入普通方法
expandoMetaClass.say = {
    println "My name is ${delegate.name}"
}

// 为 expandoMetaClass 注入静态方法
expandoMetaClass.'static'.fun = {
    println "Class Type : ${delegate}"
}

再后 , 需要调用 ExpandoMetaClass 对象的 initialize 初始化方法 ;

代码语言:javascript
复制
// 初始化注入方法
expandoMetaClass.initialize()

最后 , 使用初始化后的 ExpandoMetaClass 对象 , 为

代码语言:javascript
复制
// 替换 Student.metaClass
Student.metaClass = expandoMetaClass

这样就手动的实现了 Student 类的方法注入 , 如果想要取消方法注入 , 将 Student.metaClass 置空 , 就回到了初始状态 , 之后就无法调用注入的方法 ;

代码语言:javascript
复制
// 将 Student.metaClass 置空 , 又回到了初始状态
// 之后就无法调用注入的方法
Student.metaClass = null

三、完整代码示例


完整代码示例 :

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

println Student.metaClass

// 使用 ExpandoMetaClass 注入方法
def expandoMetaClass = new ExpandoMetaClass(Student)

// 为 expandoMetaClass 注入普通方法
expandoMetaClass.hello = {
    println "Hello ${delegate.name}"
}

// 为 expandoMetaClass 注入普通方法
expandoMetaClass.say = {
    println "My name is ${delegate.name}"
}

// 为 expandoMetaClass 注入静态方法
expandoMetaClass.'static'.fun = {
    println "Class Type : ${delegate}"
}

// 为 expandoMetaClass 注入构造方法
expandoMetaClass.constructor = {
    String str ->
        new Student(name: str)
}

// 初始化注入方法
expandoMetaClass.initialize()

// 替换 Student.metaClass
Student.metaClass = expandoMetaClass

println Student.metaClass

// 调用注入的静态方法
Student.fun()

// 使用注入的构造方法初始化 Student 类
def student = new Student("Tom")

// 调用注入的普通方法
student.hello()
student.say()

// 将 Student.metaClass 置空 , 又回到了初始状态
// 之后就无法调用注入的方法
Student.metaClass = null

执行结果 :

代码语言:javascript
复制
org.codehaus.groovy.runtime.HandleMetaClass@45dd4eda[groovy.lang.MetaClassImpl@45dd4eda[class Student]]
groovy.lang.ExpandoMetaClass@670002[class Student]
Class Type : class Student
Hello Tom
My name is Tom
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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