【问题标题】:Groovy expando metaclassGroovy 扩展元类
【发布时间】:2010-10-21 15:44:24
【问题描述】:

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

def total = 100.dollars + 50.euros

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

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

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

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

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

这都不行。

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

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

【问题讨论】:

  • 该死!我需要学习 Groovy。

标签: groovy metaprogramming expandometaclass


【解决方案1】:

只要把它放在任何类的任何方法中,也许是一个 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。

【讨论】:

  • 谢谢,但我不想调用任何奇怪的方法来初始化我的 expandos。稍后执行 metaClass = null 似乎也会产生错误(groovy 在内部使用 metaClass 字段)。
  • metaClass = null 是删除所有扩展的推荐方法,正如两周前 Guillaume Laforge 所说,当我遇到他时。
猜你喜欢
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2018-05-22
  • 2016-06-22
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
相关资源
最近更新 更多