美文网首页程序员
Groovy——方法合成

Groovy——方法合成

作者: zachaxy | 来源:发表于2017-12-11 09:29 被阅读0次

前面MOP——方法注入介绍了利用 MOP 对方法的调用进行注入,接下来要介绍利用 MOP 实现方法的合成。

合成:在运行期,根据输入状态的不同,动态的生成一个方法。
这里要注意的是:方法合成,在运行时动态的生成方法,看起来很智能,但是合成是有前提的,就是调用的方法的方法名必须要符合预先定义好的规范,才能生成。

同样,这里要和前面的方法注入区分开:
方法的合成和注入看起来似乎相同,都是向类中添加方法,以扩展类的功能,但这里也是有区别的:

  • 注入是已经知道要注入的方法名了,是发生在编译期的。
  • 合成是在编译期还不知道方法名,只有在调用的时候,发现并没有对应的方法,所以动态的生成该方法,然后并调用。
    合成强调的是在运行时,注入强调的是在编译期;

实现方法合成有以下两种方式:

  • 使用 methodMissing 合成方法
  • 使用 ExpandoMetaClass 合成方法

使用 methodMissing 合成方法

首先明确以下方法合成的使用场景:其发生在对象调用了一个自身并不存在的方法,正常情况下会抛出异常,但是我们想根据调用的方法动态去生成一个对应的方法并执行。那么生成对应的方法这个步骤需要首先汇总到一个方法中——methodMissing,然后在该方法中,实现我们合成方法的逻辑。还是要注意,不是随意调用一个方法都能合成的,没有那么只能,必须符合预先设定好的规则。例如我们预先为一个人设定好其技能列表,但是不生成具体的方法,因为不知道外界会不会调用这些方法,如果全部实现一遍,到时候又可能用不到,所以需要在运行时,动态生成。

class Man {
    def skills = ["run","sing","dance","talk"];

    def methodMissing(String name,args){
        if (skills.contains(name)){
            println "I can " + name
        }
    }
}

man = new Man()
man.dance()

使用 ExpandoMetaClass 合成方法

当我们无法编辑类的源文件,那么就无法使用上面的方法了,对于这类情况,依然可以使用 ExpandoMetaClass 来合成方法,在MOP——方法注入中有提到过向 ExpandoMetaClass 中来注入方法,这里我们依然可以将 methodMissing 方法注入到 ExpandoMetaClass,从而实现方法合成。

class Man {
}

Man.metaClass.methodMissing = { String name,args ->
    def skills = ["run","sing","dance","talk"];

    if (skills.contains(name)){
        println "I can " + name
    }
}


man = new Man()
man.dance()

为具体实例合成方法

就像为具体实例注入方法一样,我们也可以为具体实例合成方法,其代码也是类似的

class Man{
}

def emc = new ExpandoMetaClass(Man)
emc.methodMissing = { String name,args ->
    def skills = ["run","sing","dance","talk"];

    if (skills.contains(name)){
        println "I can " + name
    }
}
emc.initialize()
def mike = new Man()
mike.metaClass = emc
mike.sing()

相关文章

  • Groovy——方法合成

    前面MOP——方法注入介绍了利用 MOP 对方法的调用进行注入,接下来要介绍利用 MOP 实现方法的合成。 合成:...

  • mac中搭建groovy环境

    下载groovy的SDK 下载groovy的方法很多,可以通过brew install groovy下载安装,也可...

  • Groovy和Java代码的混合

    运行Groovy代码 运行Groovy代码,有两种方法: 直接使用groovy filename命令,它会在内存中...

  • Groovy相关概念性东西

    参考文章:Groovy学习 1、Groovy的变量和方法声明 :   在Groovy中, 通过def关键字来声明变...

  • Gradle spring boot 2.1.0 Java 和

    groovy编写静态工具类方法 java 写业务代码可以 调用到 groovy目录下 的静态工具类方法 目录结构:...

  • Groovy学习之-Groovy Development Kit

    Groovy学习目录-传送门 Groovy为I/O操作提供了许多帮助方法,虽然你可以在Groovy中用标准Java...

  • 将Groovy集成到应用程序中

    Groovy集成机制 Groovy语言提出了几种在运行时将其自身集成到应用程序(Java甚至Groovy)中的方法...

  • Gradle系列五之面向对象

    类 新建一个Groovy Class,这个类叫做Person: Groovy类、方法、变量默认都是public的然...

  • Groovy匕首方法

  • Groovy基础

    基本方法参数定义 // Groovy中支持动态类型,即定义变量的时候可以不指定其类型。Groovy中,变量定义可以...

网友评论

    本文标题:Groovy——方法合成

    本文链接:https://www.haomeiwen.com/subject/conbixtx.html