Groovy中如何向已有的类添加新方法

Groovy 中有多种途径实现向原有类添加方法,具体有如下几种:

  1. MOP(meta object protocol) -- 详见 ExpandoMetaClass
  2. 扩展方法 -- GDK采用的此方法
  3. Category 注解 -- 影响范围可控
  4. Mixin

下面看下代码:

/**
 * @author :ZackZhou
 * @date :Created in 2020/10/20 10:27 AM
 * @description :如何向已有的类中添加新的方法
 * @modified By:
 * @version:
 */

//MetaClass
String.metaClass.Say = { String words ->
    println delegate + words
}

"Hello ".Say("World")

//使用Category
@Category(String)
class SayAgain{
    //必须是方法,不能是closure
    def SayWhat(String words)  {
        println "Hello " + words
    }
}

use(SayAgain){
    "Hello ".SayWhat("World")
}

// Mixin
class NewMethodProvider{
    def SaySomething = { words ->
        println delegate + words
    }
}

String.mixin(NewMethodProvider)

"Hello ".SaySomething("World")

//添加扩展方法,GDK中使用的就是此方法,DGM -- DefaultGroovyMethods
/*
* 步骤:
*   1. 创建自己的类
*   2. 在 META-INFO/services 文件句柄里面加入 此类的全路径, 如下:
*       moduleName=regina-marshal
        moduleVersion=1.0
        extensionClasses=regina.Marshal
        staticExtensionClasses=
*   3. 将此项目打成jar
*   4. 使用者引入此jar 即可
* */


//建议使用优先级:  category class > meta class > mixin

//Delegate -- 不能向已有的无法更改的类添加方法,但是可以在新加的类中使用,用来将别的类的方法 添加到新的类中,本质上是 编译器 将别的类的实例加入到了此类中,然后定义相同名字的方法,调用原来类的方法
class Human{
    def Say(String words)
    {
        println(words)
    }
}

class Women{
    @Delegate Human human

    def Birth()
    {
        println("AAA")
    }
}

Women women = new Women(human: new Human())
women.Say("Yes")
women.Birth()

 

posted @ 2020-10-20 11:09  ZackZhou  阅读(494)  评论(0编辑  收藏  举报