如何迭代groovy类非静态闭包并可选择替换它们?

时间:2011-09-19 12:43:19

标签: groovy

我想迭代groovy类非静态闭包,并可选择替换它们。

我可以用类似

的东西获得MetaClass
MyClassName.metaClass

从那里我可以获得所有属性,如

metaClassObject.properties

是MetaProperty对象的列表。

问题在于我无法检测哪些属性是闭包,哪些是简单对象。 MetaProperty对象的type属性在两种情况下都返回Object。

关于替换:让我们说,我知道它是一个闭包A,然后我可以创建另一个闭包B,用一些可选代码包装闭包A并在类定义中用B替换闭包A吗?应该像某种拦截器一样工作。

1 个答案:

答案 0 :(得分:2)

这是我试过的一种方式:

class Test {
  def name = 'tim'

  def processor = { str ->
    "Hello $name $str"
  }
}

Test t = new Test()

t.metaClass.properties.each {
  if( t[ it.name ].metaClass.respondsTo( it, 'doCall' ) ) {
    println "$it.name is a closure"
    def old = t[ it.name ]
    t.metaClass[ it.name ] = { str ->
      "WOO! ${old( str )}"
    }
  }
}

println t.processor( 'groovy!' ) // prints 'WOO! Hello tim groovy!'

然而,它需要扩展,因为我依赖于我知道修补补丁更换需要多少参数的事实

也可能有一种更简单的方法......