文章目录

  • 一、动态注入方法
  • 二、完整代码示例

一、动态注入方法


调用 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 元对象协议与元编程 ( 方法合成 | 动态注入方法 )相关推荐

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

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

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

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

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

    文章目录 一.使用 ExpandoMetaClass 进行方法注入 三.完整代码示例 一.使用 ExpandoMetaClass 进行方法注入 在 [Groovy]MOP 元对象协议与元编程 ( 方法 ...

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

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

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

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

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

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

  7. 【Groovy】MOP 元对象协议与元编程 ( 通过 MetaMethod#invoke 执行 Groovy 方法 )

    文章目录 一.通过 MetaMethod#invoke 执行 Groovy 方法 二.完整代码示例 一.通过 MetaMethod#invoke 执行 Groovy 方法 已经定义 Groovy 类 ...

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

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

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

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

最新文章

  1. JDK与JRE的关系和path的作用浅谈
  2. CSS学习笔记--浮动元素由于浏览器页面缩小而被挤到下面的解决方法
  3. python编程做什么工作-学习Python编程后在成都可以做哪些工作?
  4. Centos7 Greenplum6.1开源版本集群部署
  5. get clone 出现 fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 报错信息
  6. 2009 CCTV体坛风云人物颁奖盛典,精彩语录
  7. 往hbase插入数据,你会选择哪种?
  8. 整数分解为若干项之和python_SVD奇异值分解及Python实例
  9. VSCode在文件顶部添加作者,时间和注释等信息
  10. (转)什么是DevOps?阿里专家为你来解读
  11. 【Markdown 数学公式】markdown常用公式写法
  12. 为什么现在更多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码?
  13. 微软与纳斯达克开展合作将区块链产品整合至纳斯达克服务中
  14. OpenCV每日函数 图像处理模块 applyColorMap颜色映射函数
  15. 解决MATLAB高版本启动较慢问题
  16. Linux从入门到秃头
  17. 逻辑卷管理LVM(logical volume manager)
  18. Spring mvc基于注解自定义servlet
  19. 单片机综合实验 - 02 | 中断与定时/计数器实验
  20. ThinkPad开机进入启动项选择、Bios以及更改Fn功能键、交换Fn和Ctrl位置

热门文章

  1. Unique Paths II leetcode java
  2. Oracle字符集问题总结
  3. ip对应的区域查询(php版)(转)
  4. 看一遍那些网络上晦涩的名词都弄明白了!
  5. 全flash站制作剖析
  6. feign date类型时间错误问题
  7. HDU2866 Special Prime
  8. Awk中调用shell命令
  9. java 一些常用的代码(转载)
  10. [导入]创建笔 (Visual C#)