文章目录

  • 一、使用 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 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )相关推荐

  1. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )

    文章目录 一.重写 MetaClass#invokeMethod 方法实现函数拦截 二.在 MetaClass#invokeMethod 方法中调用对象的其它方法 三.完整代码示例 一.重写 Meta ...

  2. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法拦截 JDK 中已经定义的函数 )

    文章目录 一.重写 MetaClass#invokeMethod 方法拦截 JDK 中已经定义的函数 1.被拦截的 String#contains 方法原型 2.JDK 正常用法 3.拦截 Strin ...

  3. 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )

    文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...

  4. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )

    文章目录 一.使用 Mixin 混合进行方法注入 二.Mixin 混合多个类优先级分析 一.使用 Mixin 混合进行方法注入 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法注入 ...

  5. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )

    文章目录 一.使用 ExpandoMetaClass 进行方法注入 三.完整代码示例 一.使用 ExpandoMetaClass 进行方法注入 在 [Groovy]MOP 元对象协议与元编程 ( 方法 ...

  6. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )

    文章目录 一.使用 Category 分类进行方法注入的优点 二.使用 Category 分类进行方法注入的缺点 一.使用 Category 分类进行方法注入的优点 之前的博客 [Groovy]MOP ...

  7. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )

    文章目录 一.GroovyInterceptable 接口简介 二.重写 GroovyObject#invokeMethod 方法 三.GroovyInterceptable 接口拦截效果 四.完整代 ...

  8. 【Groovy】MOP 元对象协议与元编程 ( 通过 MetaMethod#invoke 执行 Groovy 方法 )

    文章目录 一.通过 MetaMethod#invoke 执行 Groovy 方法 二.完整代码示例 一.通过 MetaMethod#invoke 执行 Groovy 方法 已经定义 Groovy 类 ...

  9. 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )

    文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...

最新文章

  1. Firefox下div层被Flash遮住的解决方法
  2. VS2015提示gets未定义
  3. 从 bug 中学习:六大开源项目告诉你 go 并发编程的那些坑
  4. Swift--数组和字典(二)
  5. 2021牛客暑期多校训练营1
  6. [css] 用css给一个元素加边框有哪些方法?
  7. 【Q】【poj 1144】【poj 1523】
  8. 简练软考知识点整理-建设项目团队
  9. saltstack 任务管理和集群(三)
  10. 社交游戏Zynga之死
  11. 跟 05 后拼年龄?算了,11 岁的他都成比特币专家了
  12. Python高级知识点学习(一)
  13. matlab练习程序(构造简单多边形)
  14. python解析css文件_Python格式化css文件的方法
  15. MFC vs2012 Office2013 读写excel文件
  16. settings.xml‘ has syntax errors
  17. 修改文件属性与权限(鸟哥linux私房菜)
  18. 人人商城小程序服务器根目录,微擎通用-人人商城v3小程序安装步骤小程序配置说明...
  19. 俄罗斯方块,消消乐源码下载
  20. 计算机网络技术毕业生实习报告_计算机毕业实习报告8篇完美版

热门文章

  1. 导出websphere内存镜像
  2. NodeList 和 HTMLCollection
  3. python批量改动指定文件夹文件名称
  4. 【语法】点语法的应用
  5. IIS 承载的WCF服务失败
  6. [Ubuntu] 如何在Ubuntu11.04将PHP5.3降级到PHP5.2
  7. 802.1x认证协议的应用
  8. IDOC 创建,增强,管理,配置
  9. [网站上线]Lamp环境及其后续配置
  10. javascript模块化之CommonJS、AMD、CMD、UMD、ES6