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 delegate + 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

Groovy中如何向已有的类添加新方法的更多相关文章

  1. C#中的扩展方法(向已有类添加方法,但无需创建新的派生类型)

    C#中的扩展方法 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...

  2. runtime-给系统已有类添加属性

    在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种.类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添 ...

  3. phpcms如何给已有的模块添加新功能?

    phpcms如何给已有的模块添加新功能? 方法一:直接在模块里的控制器文件中添加功能. 不建议使用此方法,因为一旦phpcms升级,有可能会覆盖模块中的文件, 导致你添加的功能丢失. 方法二:新建一个 ...

  4. RegisterUserFunc为测试对象添加新方法或重写已有方法

    QTP中为了提高扩展性,提供了一个为测试对象添加一个新的自定义方法,或者重写测试对象已有的方法的函数RegisterUserFunc,在此给大家分享一下. RegisterUserFunc:为测试对象 ...

  5. 在C#中我们能调用一个类的私有方法吗

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.

  6. C#中WinFrom保存文件SaveFileDialog类的使用方法

    C#中WinFrom保存文件SaveFileDialog类的使用方法 使用的命名空间是:System.Windows.Forms; 常用属性:   Title:保存对话框的标题,默认为"另存 ...

  7. spring AOP Bean添加新方法

    目的:为studentAdditionalDetails中添加Student的showDetails()和ExtraShowDetails()两个方法 spring  中AOP能够为现有的方法添加额外 ...

  8. MVC中为自动生成实体类添加验证

    将额外的基于特性的元数据(象验证特性)施加到由VS设计器自动生成/维护的类的一个方法是,采用一个我们称之为“伙伴类(buddy classes)”的技术. 基本上来说,你创建另外一个类,包含你的验证特 ...

  9. ASP.NET MVC系列:为已有模型添加新的属性

    在模型类Movie中添加一个新的属性Rating

随机推荐

  1. 内存管理初始化源码3:bootmem

    start_kernel ——> setup_arch ——> arch_mem_init ——> bootmem_init ——> init_bootmem_node: 此时 ...

  2. Linux宏:__ASSEMBLY__

    汇编:assembly 猜测:所以这个宏跟汇编有关?! 引用:某些常量宏会同时被C和asm引用,而C与asm在对立即数符号的处理上是不同的.asm中通过指令来区分其操作数是有符号还是无符号的,而不是通 ...

  3. 最好用的流程编辑器bpmn-js系列之基本使用

    最好用的流程编辑器bpmn-js系列文章 BPMN(Business Process Modeling Notation)是由业务流程管理倡议组织BPMI(The Business Process M ...

  4. maximo入门---开发者提要

    1.添加控件 在一个程序设计器里添加控件,控件必须要和这个程序对象(这个程序关联的表)的一个属性绑定 ps maximo挺高级的,比如一个date类型的输入框,会自动给他补上时间控件 2.复制程序 复 ...

  5. Java中toCharArray()方法

    Java中 toCharArray() 方法详解 <Thinking in Java>Chapter11中存在下列代码 package holding; import java.util. ...

  6. Java之再初识二

    本篇博客将继续介绍Java基础知识 1.Java包含哪些数据类型 2.Java基本数据类型转换包含哪两类 3.为什么需要包装类 4.int与integer有什么区别,它们之间如何相互转化的 5.逻辑运 ...

  7. GZip 压缩解压 工具类 [ GZipUtil ]

    片段 1 片段 2 pom.xml <dependency> <groupId>commons-codec</groupId> <artifactId> ...

  8. JMeter Websocket 二进制Binary压力测试或接口测试

    背景 最近在做游戏项目,做好java服务端,需要本地调试Websock服务,并且是二进制binary形式传输,网上的很多都是text形式传输的测试页面,所以不符合要求.为了解决websocket的二进 ...

  9. linux中重启网卡后网络不通(NetworkManager篇)

    1.问题描述 RHEL7.6系统,使用nmcli绑定双网卡后,在使用以下命令重启network服务后主机网络异常,导致无法通过ssh远程登录系统. systemctl restart network ...

  10. Go-archive/tar: write after close gopher.txt

    where? 在使用Go中tar包循环写入内容的时候 why? 因为已经关闭了tar.writer对象,所以无法写入,但是程序还是有写入操作,所以报错 way? 通过 defer关键字来管理资源的释放 ...