【问题标题】:How to iterate over groovy class non-static closures and optionally replace them?如何迭代 groovy 类非静态闭包并可选择替换它们?
【发布时间】:2011-11-20 05:31:19
【问题描述】:

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

我可以通过类似的方式获得 MetaClass

MyClassName.metaClass

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

metaClassObject.properties

这是 MetaProperty 对象的列表。

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

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

【问题讨论】:

    标签: groovy


    【解决方案1】:

    这是我尝试过的一种方法:

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

    但是,它需要扩展,因为我依赖于我知道修补闭包替换需要多少参数这一事实

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多