在Groovy中访问静态闭包的值

我想在静态闭包中存储一些属性,然后在方法调用期间访问它们:

class Person {  
static someMap = { key1: "value1",key2: "value2" }  
}

那么如何在Person中编写一个方法来检索这些存储的数据呢?

解决方法

对于简单的情况,您最好使用地图.

如果你真的想把它评估为一个闭包(可能是为了创建你自己的DSL),你需要稍微改变你的语法,就像John指出的那样.这是使用Builder类来评估传递给构建器的任何内容中的“某事”闭包的一种方法.

它使用groovy元编程来拦截缺少方法/属性的调用并将其保存:

class SomethingBuilder {
    Map valueMap = [:]

    SomethingBuilder(object) {
        def callable = object.something
        callable.delegate = this
        callable.resolveStrategy = Closure.DELEGATE_FIRST
        callable()
    }

    def propertyMissing(String name) {
        return valueMap[name]
    }

    def propertyMissing(String name,value) {
        valueMap[name] = value
    }

    def methodMissing(String name,args) {
        if (args.size() == 1) {
            valueMap[name] = args[0]
        } else {
            valueMap[name] = args
        }
    }
}

class Person {
    static something = {
        key1 "value1"              // calls methodMissing("key1",["value1"])
        key2("value2")             // calls methodMissing("key2",["value2"])
        key3 = "value3"            // calls propertyMissing("key3","value3")
        key4 "foo","bar","baz"   // calls methodMissing("key4",["foo","baz"])
    }
}

def builder = new SomethingBuilder(new Person())

assert "value1" == builder."key1"  // calls propertyMissing("key1")
assert "value2" == builder."key2"  // calls propertyMissing("key2")
assert "value3" == builder."key3"  // calls propertyMissing("key3")
assert ["foo","baz"] == builder."key4"  // calls propertyMissing("key4")

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...