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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )相关的知识,希望对你有一定的参考价值。

文章目录





一、GroovyInterceptable 接口简介



定义 Groovy 类时 , 令该类实现 GroovyInterceptable 接口 , 该 GroovyInterceptable 接口继承自 GroovyObject 接口 ,

public interface GroovyInterceptable extends GroovyObject 

由上面的代码可知 , 在 GroovyInterceptable 接口中 , 没有在 GroovyObject 接口 的基础上 , 定义新的抽象方法 ;





二、重写 GroovyObject#invokeMethod 方法



定义 Student 实现 GroovyInterceptable 接口 ,

class Student implements GroovyInterceptable
    def name;

    def hello() 
        println "Hello $name"
    

那么调用 Student 对象的任何方法 , 都会调用到 GroovyObject 的 invokeMethod 方法 ;

public interface GroovyObject 
    /**
     * Invokes the given method.
     *
     * @param name the name of the method to call
     * @param args the arguments to use for the method call
     * @return the result of invoking the method
     */
    Object invokeMethod(String name, Object args);

重写 Student 类中的 invokeMethod 方法 ,

class Student implements GroovyInterceptable
    def name;

    def hello() 
        println "Hello $name"
    

    @Override
    Object invokeMethod(String name, Object args) 
        System.out.println "invokeMethod"
    





三、GroovyInterceptable 接口拦截效果



GroovyInterceptable 接口 :

  • 没有实现 GroovyInterceptable 接口 :

    • 直接调用方法 : 不会触发 invokeMethod 方法 ;
    • 通过 invokeMethod 调用方法 : 会触发 invokeMethod 方法 ;
    • 调用不存在的方法 : 会报错 ;
  • 实现了 GroovyInterceptable 接口 :

    • 直接调用方法 : 会触发 invokeMethod 方法 ;
    • 通过 invokeMethod 调用方法 : 会触发 invokeMethod 方法 ;
    • 调用不存在的方法 : 不会报错 ;




四、完整代码示例



完整代码示例 :

class Student implements GroovyInterceptable
    def name;

    def hello() 
        println "Hello $name"
    

    @Override
    Object invokeMethod(String name, Object args) 
        System.out.println "invokeMethod : $name"
    


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

// 直接调用 hello 方法
student.hello()

// 调用不存在的方法 , 也会触发 invokeMethod 方法
student.hello1()

执行结果 :

invokeMethod : hello
invokeMethod : hello1

以上是关于GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )的主要内容,如果未能解决你的问题,请参考以下文章

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )

GroovyMOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )

GroovyMOP 元对象协议与元编程 ( 方法合成引入 | 类内部获取 HandleMetaClass )

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 注入静态方法 )