我想迭代groovy类非静态闭包,并可选择替换它们。
我可以用类似
的东西获得MetaClassMyClassName.metaClass
从那里我可以获得所有属性,如
metaClassObject.properties
是MetaProperty对象的列表。
问题在于我无法检测哪些属性是闭包,哪些是简单对象。 MetaProperty
对象的type属性在两种情况下都返回Object。
关于替换:让我们说,我知道它是一个闭包A,然后我可以创建另一个闭包B,用一些可选代码包装闭包A并在类定义中用B替换闭包A吗?应该像某种拦截器一样工作。
答案 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!'
然而,它需要扩展,因为我依赖于我知道修补补丁更换需要多少参数的事实
也可能有一种更简单的方法......