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

简介: 【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、对象方法拦截


创建 2 22 个 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 22 个 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

image.png

目录
相关文章
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )
155 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )
174 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
200 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
168 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入普通方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入普通方法 )
142 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入普通方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )
140 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )
134 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )
139 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
148 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 使用 @Delegate 注解进行方法委托 )
【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 使用 @Delegate 注解进行方法委托 )
158 0
【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 使用 @Delegate 注解进行方法委托 )