GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )相关的知识,希望对你有一定的参考价值。
文章目录
一、使用 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、对象方法拦截
创建 2 2 2 个 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、类方法拦截
创建 2 2 2 个 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
以上是关于GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )的主要内容,如果未能解决你的问题,请参考以下文章
GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
GroovyMOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )
GroovyMOP 元对象协议与元编程 ( 方法合成引入 | 类内部获取 HandleMetaClass )
GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )