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

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

一、动态注入方法


调用 Student 类不存在的方法 , 如果该类重写了

def methodMissing(String name, def args)

方法 , 就会回调该函数 , 并且可以从参数中拿到方法名和参数列表 ;


在 methodMissing 方法中 , 可以动态注入该不存在的函数 ;


首先 , 获取 org.codehaus.groovy.runtime.HandleMetaClass 类 , 先将 this 赋值给 Student 对象 , 然后通过 Student 对象获取 metaClass ;

// 先将 this 赋值给 Student 对象
        // 然后通过 Student 对象获取 metaClass
        Student student = this
        println student.metaClass


然后 , 根据方法名称 , 动态注入方法 ; 使用 student.metaClass."方法名" = {闭包} 代码进行方法注入 , 注册前 , 不知道方法名称 , 运行时动态确定注入的方法名 ;

println "动态注入 ${name} 方法, 开始注入!"
        // 动态注入方法
        student.metaClass."${name}" = {
            println "执行动态注入 ${name} 方法, 执行相关操作!"
        }
        println "动态注入 ${name} 方法, 注入完毕!"

最后 , 方法注入之后 , 使用 "方法名"(参数列表) 代码调用注入的方法 , 只需要知道方法名就可以调用该方法 ;


// 调用上述动态注入的方法
        // 注意这里传入的参数, 可以直接传入闭包中
        "$name"(args)


二、完整代码示例


完整代码示例 :

class Student {
    def methodMissing(String name, def args) {
        // 直接获取 metaClass
        println metaClass
        // 先将 this 赋值给 Student 对象
        // 然后通过 Student 对象获取 metaClass
        Student student = this
        println student.metaClass
        println "动态注入 ${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 方法, 执行相关操作!

image.png

目录
相关文章
|
前端开发 小程序
微信小程序canvas画布绘制base64图片并保存图片到相册中
微信小程序canvas画布绘制base64图片并保存图片到相册中
403 0
|
12月前
|
缓存 监控 Java
解决 Groovy 引起的一次 OOM 告警
线上OOM告警了,一个简单的case演示如何分析和解决。
171 2
|
Java 开发者
Java一分钟之-Groovy与Java混合编程
【6月更文挑战第13天】本文探讨了Groovy与Java的混合编程,强调了Groovy在JVM上的动态特性及其与Java的高兼容性。文章指出,尽管二者可无缝共存,但仍存在类型不匹配、闭包与匿名内部类差异及语法糖导致的问题。为避免这些问题,建议在Groovy中显式指定类型、理解闭包与匿名类的区别,并制定统一编码规范。通过实例展示了Java调用Groovy脚本和Groovy调用Java类的方法,强调理解两种语言特性的重要性,以实现更高效、维护性更强的系统。
468 3
Java一分钟之-Groovy与Java混合编程
|
Java 开发者 API
使用Groovy探索动态语言编程的魅力
【6月更文挑战第6天】Groovy,一种运行在JVM上的动态语言,融合了Java的全部功能与动态语言的便利性。其动态特性包括:动态类型(运行时确定变量类型)、动态方法调用(使用字符串作为方法名)和动态脚本执行(运行时加载执行脚本)。Groovy适用于简化配置、构建DSL和实现灵活插件系统,提供高效开发体验。通过Groovy,开发者能更好地发掘动态编程的魅力。
|
12月前
|
Web App开发 Ubuntu 前端开发
【踩坑记】Ubuntu 20.04.6 LTS下编译安装gcc 4.4.0
【踩坑记】Ubuntu 20.04.6 LTS下编译安装gcc 4.4.0
|
人工智能 运维 Cloud Native
|
消息中间件 算法 Kafka
面试题Kafka问题之Kafka的副本消息同步如何解决
面试题Kafka问题之Kafka的副本消息同步如何解决
256 4
|
Linux
Centos7.4升级7.9失败,救援:/boot目录下文件丢失error: file ‘/initramfs-3.10.0-957.el7.x86_64.img‘ not found
以上步骤应该可以帮助你解决问题。如果问题仍然存在,可能需要更深入的排查。
449 1
|
Java
【Groovy】Groovy 动态语言特性 ( Groovy 语言与 Java 语言执行效率对比 | 以动态特性编译的 Groovy 类 | 以静态特性编译的 Groovy 类 )
【Groovy】Groovy 动态语言特性 ( Groovy 语言与 Java 语言执行效率对比 | 以动态特性编译的 Groovy 类 | 以静态特性编译的 Groovy 类 )
394 0