Groovy中如何向已有的类添加新方法
Groovy 中有多种途径实现向原有类添加方法,具体有如下几种:
- MOP(meta object protocol) -- 详见 ExpandoMetaClass
- 扩展方法 -- GDK采用的此方法
- Category 注解 -- 影响范围可控
- 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()