Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何迭代groovy类的非静态闭包并有选择地替换它们?_Groovy - Fatal编程技术网

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

如何迭代groovy类的非静态闭包并有选择地替换它们?,groovy,Groovy,我想迭代groovy类的非静态闭包,并有选择地替换它们 我可以用类似的东西得到元类 MyClassName.metaClass 从那里我可以得到所有的属性,比如 metaClassObject.properties 这是元属性对象的列表 问题是我无法检测这些属性中哪些是闭包,哪些是简单对象元属性在这两种情况下,对象的类型属性都返回对象 关于替换:比方说,我知道它是一个闭包a,那么我可以创建另一个闭包B,用一些可选代码包装闭包a,并在类定义中将闭包a替换为B吗?应该像某种拦截器一样工作。这是我

我想迭代groovy类的非静态闭包,并有选择地替换它们

我可以用类似的东西得到元类

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!'
然而,它需要扩展,因为我知道修补闭合替换需要多少参数

也可能有一种更简单的方法来做到这一点