我能够在Groovy的ConfigSlurper上绑定一个对象,但不能绑定方法。这不可能吗?
这是一个例子
String conf = """
k1 = "v1"
environments{
prod{
person.create("prod.id1"){
name = "prod.name1"
}
}
dev {
person.create("dev.id1"){
name = "dev.name1"
}
}
}
environments{
prod{
create("prod.id2"){
name = "prod.name2"
}
}
dev {
create("dev.id2"){
name = "dev.name2"
}
}
}
"""
def parser = new ConfigSlurper("prod")
Person person1 = new Person()
Person person2 = new Person()
parser.setBinding([person: person1, // <-- SUCCESS
create: person2.&create]) // <-- NOT SUCCESS?
println parser.parse(conf)
println "person1=${person1.dump()}"
println "person2=${person2.dump()}"
class Person{
String id
String name
public void create(String id, Closure c){
this.id = id
this.with(c)
}
}
输出
[k1:v1, create:prod.id2, create.name:prod.name2]
person1=<Person@409b0772 id=prod.id1 name=prod.name1>
person2=<Person@205ee81 id=null name=null>
请忽略示例中的任何设计缺陷。
答案 0 :(得分:1)
person.create(...)
由Groovy翻译为getProperty('person').invokeMethod('create', ...)
,因为person
在绑定中定义,create
在getProperty('person')
返回的对象上定义,所以它有效。
create.call(...)
有效,因为它被翻译为getProperty('create').invokeMethod('call', ...)
。 create
属性是通过绑定定义的,属于MethodClosure
类型,定义了call
方法。
但create(...)
已翻译为invokeMethod('create', ...)
。它失败,因为没有方法create
,您无法通过绑定定义方法。