前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )

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

作者头像
韩曙亮
发布2023-03-30 10:38:51
7560
发布2023-03-30 10:38:51
举报

文章目录

一、使用 MetaClass 进行方法拦截


MetaClass 可以定义类的行为 , 可以利用 MetaClass 进行方法拦截 ;

Groovy 对象 和 类 都可以获取 MetaClass 对象 , 声明 Srudent 类 , 以及创建 Student 对象 ,

代码语言:javascript
复制
class Student{

    def name;

    def hello() {
        System.out.println "Hello ${name}"
    }
}

def student = new Student(name: "Tom")

1、使用 MetaClass 在单个对象上进行方法拦截

在 Groovy 对象上获取的元类对象 ,

代码语言:javascript
复制
student.metaClass

拦截 MetaClass 上的方法 , 使用

代码语言:javascript
复制
元类对象名.方法名 = {闭包}

即可拦截指定的方法 , 如下拦截 Student student 对象的 hello 方法 :

代码语言:javascript
复制
student.metaClass.hello = {
    println "Hello student.metaClass.hello"
}

执行 hello 方法时 , 执行的是闭包的内容 , 不再是原来的 hello 方法内容 ;

2、使用 MetaClass 在类上进行方法拦截

在 Groovy 类上获取的元类对象 ,

代码语言:javascript
复制
Student.metaClass

拦截 MetaClass 上的方法 , 使用

代码语言:javascript
复制
元类对象名.方法名 = {闭包}

进行拦截 , 拦截 MetaClass 类上的方法 , 如 :

代码语言:javascript
复制
// 拦截 student 对象上的方法
Student.metaClass.hello = {
    println "Hello student.metaClass.hello"
}

特别注意 : 必须在创建对象之前 , 拦截指定的方法 , 在创建对象之后拦截 , 没有任何效果 ;

二、完整代码示例


1、对象方法拦截

创建

2

个 Student 对象 , 使用 MetaClass 在其中一个对象上拦截 hello 方法 , 执行两个对象的 hello 方法 , 只有前者的 hello 方法被拦截 ;

代码示例 :

代码语言:javascript
复制
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()

执行结果 :

代码语言:javascript
复制
Hello student.metaClass.hello
Hello Jerry
在这里插入图片描述
在这里插入图片描述

2、类方法拦截

创建

2

个 Student 对象 , 使用 MetaClass 在类上拦截 hello 方法 , 执行两个对象的 hello 方法 , 两个对象的 hello 方法都被拦截 ;

特别注意 : 必须在创建对象之前 , 拦截指定的方法 , 在创建对象之后拦截 , 没有任何效果 ;

代码示例 :

代码语言:javascript
复制
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()

执行结果 :

代码语言:javascript
复制
Hello student.metaClass.hello
Hello student.metaClass.hello
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、使用 MetaClass 进行方法拦截
    • 1、使用 MetaClass 在单个对象上进行方法拦截
      • 2、使用 MetaClass 在类上进行方法拦截
      • 二、完整代码示例
        • 1、对象方法拦截
          • 2、类方法拦截
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档