首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy expando元类

Groovy expando元类
EN

Stack Overflow用户
提问于 2009-04-24 16:15:25
回答 1查看 3.3K关注 0票数 4

我开发了一个类,它有一些方法来增强Integer,它主要让我做到这一点:

代码语言:javascript
复制
def total = 100.dollars + 50.euros

现在我必须扩展Integer.metaClass,如下所示:

代码语言:javascript
复制
Integer.metaClass.getDollars = {->
    Money.Dollar(delegate)
}

我试着把它放在文件的底部,放在Money类声明之前,但是编译器说已经存在一个名为Money的类,我知道为什么会这样(因为groovy创建了一个带有空静态void main的文件名的类来运行这段代码)。

我还尝试在类中使用静态块,如下所示:

代码语言:javascript
复制
static {
    Integer.metaClass.getDollars = {->
        Money.Dollar(delegate)
    }
}

这两种方法都不起作用。

第三种解决方案是更改文件名(如MoneyClass.groovy),并保留类名(类货币),但这似乎有点奇怪。

还有什么我能做的吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-04-24 21:08:00

只需将其放入任何类的任何方法中,可能是bean TypeEnhancer.groovy:

代码语言:javascript
复制
public class TypeEnhancer {
  public void start() {
    Integer.metaClass.getDollars() = {-> Money.Dollar(delegate) }
  }

  public void stop() {
    Integer.metaClass = null
  }
}

只需通过调用start():new TypeEnhancer().start();来创建和初始化。要禁用增强功能,请调用new TypeEnhancer().stop();。bean也可以用作Spring bean。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/786560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档