【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )
文章目录
- 一、使用 MetaClass 进行方法拦截
- 1、使用 MetaClass 在单个对象上进行方法拦截
- 2、使用 MetaClass 在类上进行方法拦截
- 二、完整代码示例
- 1、对象方法拦截
- 2、类方法拦截
一、使用 MetaClass 进行方法拦截
MetaClass 可以定义类的行为 , 可以利用 MetaClass 进行方法拦截 ;
Groovy 对象 和 类 都可以获取 MetaClass 对象 , 声明 Srudent 类 , 以及创建 Student 对象 ,
class Student{def name;def hello() {System.out.println "Hello ${name}"}
}def student = new Student(name: "Tom")
1、使用 MetaClass 在单个对象上进行方法拦截
在 Groovy 对象上获取的元类对象 ,
student.metaClass
拦截 MetaClass 上的方法 , 使用
元类对象名.方法名 = {闭包}
即可拦截指定的方法 , 如下拦截 Student student 对象的 hello 方法 :
student.metaClass.hello = {println "Hello student.metaClass.hello"
}
执行 hello 方法时 , 执行的是闭包的内容 , 不再是原来的 hello 方法内容 ;
2、使用 MetaClass 在类上进行方法拦截
在 Groovy 类上获取的元类对象 ,
Student.metaClass
拦截 MetaClass 上的方法 , 使用
元类对象名.方法名 = {闭包}
进行拦截 , 拦截 MetaClass 类上的方法 , 如 :
// 拦截 student 对象上的方法
Student.metaClass.hello = {println "Hello student.metaClass.hello"
}
特别注意 : 必须在创建对象之前 , 拦截指定的方法 , 在创建对象之后拦截 , 没有任何效果 ;
二、完整代码示例
1、对象方法拦截
创建 222 个 Student 对象 , 使用 MetaClass 在其中一个对象上拦截 hello 方法 , 执行两个对象的 hello 方法 , 只有前者的 hello 方法被拦截 ;
代码示例 :
class Student{def name;def hello() {System.out.println "Hello ${name}"}
}def student = new Student(name: "Tom")
def student2 = new Student(name: "Jerry")// Groovy 对象上获取的元类对象
student.metaClass// Groovy 类上获取的元类
Student.metaClass// 拦截 student 对象上的方法
student.metaClass.hello = {println "Hello student.metaClass.hello"
}// 直接调用 hello 方法
student.hello()
student2.hello()
执行结果 :
Hello student.metaClass.hello
Hello Jerry
2、类方法拦截
创建 222 个 Student 对象 , 使用 MetaClass 在类上拦截 hello 方法 , 执行两个对象的 hello 方法 , 两个对象的 hello 方法都被拦截 ;
特别注意 : 必须在创建对象之前 , 拦截指定的方法 , 在创建对象之后拦截 , 没有任何效果 ;
代码示例 :
class Student{def name;def hello() {System.out.println "Hello ${name}"}
}// 拦截 student 对象上的方法
// 特别注意 : 必须在创建对象之前拦截方法
// 创建对象之后再拦截方法 , 没有效果
Student.metaClass.hello = {println "Hello student.metaClass.hello"
}def student = new Student(name: "Tom")
def student2 = new Student(name: "Jerry")// Groovy 对象上获取的元类对象
student.metaClass// Groovy 类上获取的元类
Student.metaClass// 直接调用 hello 方法
student.hello()
student2.hello()
执行结果 :
Hello student.metaClass.hello
Hello student.metaClass.hello
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )相关推荐
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )
文章目录 一.重写 MetaClass#invokeMethod 方法实现函数拦截 二.在 MetaClass#invokeMethod 方法中调用对象的其它方法 三.完整代码示例 一.重写 Meta ...
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法拦截 JDK 中已经定义的函数 )
文章目录 一.重写 MetaClass#invokeMethod 方法拦截 JDK 中已经定义的函数 1.被拦截的 String#contains 方法原型 2.JDK 正常用法 3.拦截 Strin ...
- 【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 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )
文章目录 一.GroovyInterceptable 接口简介 二.重写 GroovyObject#invokeMethod 方法 三.GroovyInterceptable 接口拦截效果 四.完整代 ...
- 【Groovy】MOP 元对象协议与元编程 ( 通过 MetaMethod#invoke 执行 Groovy 方法 )
文章目录 一.通过 MetaMethod#invoke 执行 Groovy 方法 二.完整代码示例 一.通过 MetaMethod#invoke 执行 Groovy 方法 已经定义 Groovy 类 ...
- 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )
文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...
最新文章
- Firefox下div层被Flash遮住的解决方法
- VS2015提示gets未定义
- 从 bug 中学习:六大开源项目告诉你 go 并发编程的那些坑
- Swift--数组和字典(二)
- 2021牛客暑期多校训练营1
- [css] 用css给一个元素加边框有哪些方法?
- 【Q】【poj 1144】【poj 1523】
- 简练软考知识点整理-建设项目团队
- saltstack 任务管理和集群(三)
- 社交游戏Zynga之死
- 跟 05 后拼年龄?算了,11 岁的他都成比特币专家了
- Python高级知识点学习(一)
- matlab练习程序(构造简单多边形)
- python解析css文件_Python格式化css文件的方法
- MFC vs2012 Office2013 读写excel文件
- settings.xml‘ has syntax errors
- 修改文件属性与权限(鸟哥linux私房菜)
- 人人商城小程序服务器根目录,微擎通用-人人商城v3小程序安装步骤小程序配置说明...
- 俄罗斯方块,消消乐源码下载
- 计算机网络技术毕业生实习报告_计算机毕业实习报告8篇完美版