开发者

How to iterate over groovy class non-static closures and optionally replace them?

I'd like to iterate over groovy class non-static closures and optionally replace them.

I can get MetaClass with something like

MyClassName.metaClass

and from there I can get all properties like

metaClassObject.properties

which is the list of MetaProperty objects.

The problem is that I can't detect which of those properties are closures and which are simple objects. MetaProperty object's type property return Object in both case.

开发者_如何学C

And about replacing: Let's say, I know that it is a closure A, then can I create another closure B that wraps closure A with some optional code and replace that closure A with B in the class definition? Should work like some sort of interceptor.


This is one way I have tried out:

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!'

However, it would need expanding as I rely on the fact that I know how many parameters it takes for the patching closure replacement

There may also be a simpler way to do this...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜