【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
文章目录
- 一、使用 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 进行方法注入 )相关推荐
- 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )
文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )
文章目录 一.使用 Mixin 混合进行方法注入 二.Mixin 混合多个类优先级分析 一.使用 Mixin 混合进行方法注入 在上一篇博客 [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 元对象协议与元编程 ( 方法合成 | 动态注入方法 )
文章目录 一.动态注入方法 二.完整代码示例 一.动态注入方法 调用 Student 类不存在的方法 , 如果该类重写了 def methodMissing(String name, def args ...
- 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )
文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )
文章目录 一.同时注入普通方法.静态方法.构造方法 二.完整代码示例 一.同时注入普通方法.静态方法.构造方法 如果要同时为 Groovy 类注入大量方法 , 使用 Category 分类 或 Met ...
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
文章目录 一.基础示例 二.根据字符串动态获取 MetaClass 中的方法 二.使用 evaluate 执行字符串形式的 Groovy 脚本 二.完整代码示例 一.基础示例 定义类 Student ...
最新文章
- MATLAB【十四】————调用深度库生成exe,批量运行三层文件夹下图片,保存结果
- optee中的panic函数实现
- 利用python创建一个新本地文件
- Android线程优先级设置方法技巧
- 【算法分析与设计】实验 分治算法解决中位数问题
- .htaccess跳转https
- 那年我学过的SpringBoot笔记
- 富士康跳楼事件续集,主管扬言现场把人处理掉,并表示拒不处理善后
- 计算机科学导论课后总结
- IE8安装flash插件
- [人工智能-深度学习-32]:卷积神经网络CNN - 常见分类网络- AlexNet网络结构分析与详解
- pubg服务器维护6.23,pubg维护6月23日 | 手游网游页游攻略大全
- 端端正正做人,踏踏实实做事
- 了解Java对象(抽象和具体)
- 地统计分析在气象领域的应用
- 浙江推出冷链上“链” 全面掌握冷链食品供应链流向
- 一铲子下去,服务器全瘫痪......
- 分享9个超好用的免费工具/软件/网站(一定有你要的)
- 中机云告诉你,云计算有这10大好处|中机智库
- WINCE 性能评测