如何迭代groovy类的非静态闭包并有选择地替换它们?
我想迭代groovy类的非静态闭包,并有选择地替换它们 我可以用类似的东西得到元类如何迭代groovy类的非静态闭包并有选择地替换它们?,groovy,Groovy,我想迭代groovy类的非静态闭包,并有选择地替换它们 我可以用类似的东西得到元类 MyClassName.metaClass 从那里我可以得到所有的属性,比如 metaClassObject.properties 这是元属性对象的列表 问题是我无法检测这些属性中哪些是闭包,哪些是简单对象元属性在这两种情况下,对象的类型属性都返回对象 关于替换:比方说,我知道它是一个闭包a,那么我可以创建另一个闭包B,用一些可选代码包装闭包a,并在类定义中将闭包a替换为B吗?应该像某种拦截器一样工作。这是我
MyClassName.metaClass
从那里我可以得到所有的属性,比如
metaClassObject.properties
这是元属性对象的列表
问题是我无法检测这些属性中哪些是闭包,哪些是简单对象<代码>元属性在这两种情况下,对象的类型属性都返回对象
关于替换:比方说,我知道它是一个闭包a,那么我可以创建另一个闭包B,用一些可选代码包装闭包a,并在类定义中将闭包a替换为B吗?应该像某种拦截器一样工作。这是我尝试过的一种方法:
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!'
然而,它需要扩展,因为我知道修补闭合替换需要多少参数
也可能有一种更简单的方法来做到这一点