【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )
文章目录
- 一、动态注入方法
- 二、完整代码示例
一、动态注入方法
调用 Student 类不存在的方法 , 如果该类重写了
def methodMissing(String name, def args)
方法 , 就会回调该函数 , 并且可以从参数中拿到方法名和参数列表 ;
在 methodMissing 方法中 , 可以动态注入该不存在的函数 ;
首先 , 获取 org.codehaus.groovy.runtime.HandleMetaClass
类 , 先将 this 赋值给 Student 对象 , 然后通过 Student 对象获取 metaClass ;
// 先将 this 赋值给 Student 对象// 然后通过 Student 对象获取 metaClassStudent student = thisprintln student.metaClass
然后 , 根据方法名称 , 动态注入方法 ; 使用 student.metaClass."方法名" = {闭包}
代码进行方法注入 , 注册前 , 不知道方法名称 , 运行时动态确定注入的方法名 ;
println "动态注入 ${name} 方法, 开始注入!"// 动态注入方法student.metaClass."${name}" = {println "执行动态注入 ${name} 方法, 执行相关操作!"}println "动态注入 ${name} 方法, 注入完毕!"
最后 , 方法注入之后 , 使用 "方法名"(参数列表)
代码调用注入的方法 , 只需要知道方法名就可以调用该方法 ;
// 调用上述动态注入的方法// 注意这里传入的参数, 可以直接传入闭包中"$name"(args)
二、完整代码示例
完整代码示例 :
class Student {def methodMissing(String name, def args) {// 直接获取 metaClassprintln metaClass// 先将 this 赋值给 Student 对象// 然后通过 Student 对象获取 metaClassStudent student = thisprintln student.metaClassprintln "动态注入 ${name} 方法, 开始注入!"// 动态注入方法student.metaClass."$name" = {println "执行动态注入 ${name} 方法, 执行相关操作!"}println "动态注入 ${name} 方法, 注入完毕!"// 调用上述动态注入的方法// 注意这里传入的参数, 可以直接传入闭包中"$name"(args)return null}
}def student = new Student()// 第一次调用 hello 方法 , 方法没有注入 , 先注入再执行
student.hello()
// 第二次调用hello 方法 , 方法之前注入过了 , 可以直接调用
student.hello()
执行结果 :
第一次调用 :
groovy.lang.MetaClassImpl@3e3047e6[class Student]
org.codehaus.groovy.runtime.HandleMetaClass@3e3047e6[groovy.lang.MetaClassImpl@3e3047e6[class Student]]
动态注入 hello 方法, 开始注入!
动态注入 hello 方法, 注入完毕!
执行动态注入 hello 方法, 执行相关操作!
第二次调用 :
执行动态注入 hello 方法, 执行相关操作!
【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )相关推荐
- 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )
文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )
文章目录 一.使用 Mixin 混合进行方法注入 二.Mixin 混合多个类优先级分析 一.使用 Mixin 混合进行方法注入 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法注入 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
文章目录 一.使用 ExpandoMetaClass 进行方法注入 三.完整代码示例 一.使用 ExpandoMetaClass 进行方法注入 在 [Groovy]MOP 元对象协议与元编程 ( 方法 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )
文章目录 一.使用 Category 分类进行方法注入的优点 二.使用 Category 分类进行方法注入的缺点 一.使用 Category 分类进行方法注入的优点 之前的博客 [Groovy]MOP ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
文章目录 一.方法注入 二.使用 Category 分类注入方法 三.完整代码示例 一.方法注入 在之前的博客中 , 主要是使用 Groovy 元编程 拦截方法 , 改变方法的实现 ; 使用元编程还可 ...
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )
文章目录 一.使用 MetaClass 进行方法拦截 1.使用 MetaClass 在单个对象上进行方法拦截 2.使用 MetaClass 在类上进行方法拦截 二.完整代码示例 1.对象方法拦截 2. ...
- 【Groovy】MOP 元对象协议与元编程 ( 通过 MetaMethod#invoke 执行 Groovy 方法 )
文章目录 一.通过 MetaMethod#invoke 执行 Groovy 方法 二.完整代码示例 一.通过 MetaMethod#invoke 执行 Groovy 方法 已经定义 Groovy 类 ...
- 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )
文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )
文章目录 一.同时注入普通方法.静态方法.构造方法 二.完整代码示例 一.同时注入普通方法.静态方法.构造方法 如果要同时为 Groovy 类注入大量方法 , 使用 Category 分类 或 Met ...
最新文章
- JDK与JRE的关系和path的作用浅谈
- CSS学习笔记--浮动元素由于浏览器页面缩小而被挤到下面的解决方法
- python编程做什么工作-学习Python编程后在成都可以做哪些工作?
- Centos7 Greenplum6.1开源版本集群部署
- get clone 出现 fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 报错信息
- 2009 CCTV体坛风云人物颁奖盛典,精彩语录
- 往hbase插入数据,你会选择哪种?
- 整数分解为若干项之和python_SVD奇异值分解及Python实例
- VSCode在文件顶部添加作者,时间和注释等信息
- (转)什么是DevOps?阿里专家为你来解读
- 【Markdown 数学公式】markdown常用公式写法
- 为什么现在更多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码?
- 微软与纳斯达克开展合作将区块链产品整合至纳斯达克服务中
- OpenCV每日函数 图像处理模块 applyColorMap颜色映射函数
- 解决MATLAB高版本启动较慢问题
- Linux从入门到秃头
- 逻辑卷管理LVM(logical volume manager)
- Spring mvc基于注解自定义servlet
- 单片机综合实验 - 02 | 中断与定时/计数器实验
- ThinkPad开机进入启动项选择、Bios以及更改Fn功能键、交换Fn和Ctrl位置