文章目录

  • 一、使用 ExpandoMetaClass 进行方法注入
  • 三、完整代码示例

一、使用 ExpandoMetaClass 进行方法注入


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

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

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

class Student {def name;
}

首先 , 创建 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 对象的 initialize 初始化方法 ;

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

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

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

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

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

三、完整代码示例


完整代码示例 :

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 = expandoMetaClassprintln Student.metaClass// 调用注入的静态方法
Student.fun()// 使用注入的构造方法初始化 Student 类
def student = new Student("Tom")// 调用注入的普通方法
student.hello()
student.say()// 将 Student.metaClass 置空 , 又回到了初始状态
// 之后就无法调用注入的方法
Student.metaClass = null

执行结果 :

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

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

  1. 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )

    文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...

  2. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )

    文章目录 一.使用 Mixin 混合进行方法注入 二.Mixin 混合多个类优先级分析 一.使用 Mixin 混合进行方法注入 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法注入 ...

  3. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )

    文章目录 一.使用 Category 分类进行方法注入的优点 二.使用 Category 分类进行方法注入的缺点 一.使用 Category 分类进行方法注入的优点 之前的博客 [Groovy]MOP ...

  4. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )

    文章目录 一.方法注入 二.使用 Category 分类注入方法 三.完整代码示例 一.方法注入 在之前的博客中 , 主要是使用 Groovy 元编程 拦截方法 , 改变方法的实现 ; 使用元编程还可 ...

  5. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )

    文章目录 一.使用 MetaClass 进行方法拦截 1.使用 MetaClass 在单个对象上进行方法拦截 2.使用 MetaClass 在类上进行方法拦截 二.完整代码示例 1.对象方法拦截 2. ...

  6. 【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )

    文章目录 一.动态注入方法 二.完整代码示例 一.动态注入方法 调用 Student 类不存在的方法 , 如果该类重写了 def methodMissing(String name, def args ...

  7. 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )

    文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...

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

    文章目录 一.同时注入普通方法.静态方法.构造方法 二.完整代码示例 一.同时注入普通方法.静态方法.构造方法 如果要同时为 Groovy 类注入大量方法 , 使用 Category 分类 或 Met ...

  9. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )

    文章目录 一.基础示例 二.根据字符串动态获取 MetaClass 中的方法 二.使用 evaluate 执行字符串形式的 Groovy 脚本 二.完整代码示例 一.基础示例 定义类 Student ...

最新文章

  1. MATLAB【十四】————调用深度库生成exe,批量运行三层文件夹下图片,保存结果
  2. optee中的panic函数实现
  3. 利用python创建一个新本地文件
  4. Android线程优先级设置方法技巧
  5. 【算法分析与设计】实验 分治算法解决中位数问题
  6. .htaccess跳转https
  7. 那年我学过的SpringBoot笔记
  8. 富士康跳楼事件续集,主管扬言现场把人处理掉,并表示拒不处理善后
  9. 计算机科学导论课后总结
  10. IE8安装flash插件
  11. [人工智能-深度学习-32]:卷积神经网络CNN - 常见分类网络- AlexNet网络结构分析与详解
  12. pubg服务器维护6.23,pubg维护6月23日 | 手游网游页游攻略大全
  13. 端端正正做人,踏踏实实做事
  14. 了解Java对象(抽象和具体)
  15. 地统计分析在气象领域的应用
  16. 浙江推出冷链上“链” 全面掌握冷链食品供应链流向
  17. 一铲子下去,服务器全瘫痪......
  18. 分享9个超好用的免费工具/软件/网站(一定有你要的)
  19. 中机云告诉你,云计算有这10大好处|中机智库
  20. WINCE 性能评测

热门文章

  1. [LeetCode] Excel Sheet Column Number
  2. crab-源码-模型和算法
  3. ccna设备的NAT地址转换
  4. JavaScript 异常处理
  5. 运维笔试Shell编程题
  6. 如何下载github项目中的某一部分
  7. [译]课程 9: 作业存储
  8. 基于alipay用到的
  9. linux基础(一)
  10. PHP-FPM进程数的设定