Groovy expando元类

时间:2009-04-24 16:15:25

标签: groovy metaprogramming expandometaclass

我开发了一个类,它有一些增强Integer的方法,主要是让我这样做:

def total = 100.dollars + 50.euros

现在我必须扩展Integer.metaClass做这样的事情:

Integer.metaClass.getDollars = {->
    Money.Dollar(delegate)
}

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

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

static {
    Integer.metaClass.getDollars = {->
        Money.Dollar(delegate)
    }
}

这不起作用。

第三个解决方案是更改文件名(如MoneyClass.groovy)并保留类名(Money类),但这看起来有点奇怪。

还有什么我可以做的吗?感谢。

1 个答案:

答案 0 :(得分:2)

将它放在任何类的任何方法中都可能是bean TypeEnhancer.groovy:

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。