Dynamic Groovy:使用字符串作为路径设置动态嵌套方法
我有一个对象内部对象的路径,我想使用Groovy的动态功能来设置它。通常,您只需执行以下操作即可:Dynamic Groovy:使用字符串作为路径设置动态嵌套方法,dynamic,groovy,Dynamic,Groovy,我有一个对象内部对象的路径,我想使用Groovy的动态功能来设置它。通常,您只需执行以下操作即可: class Foo { String bar } Foo foo = new Foo foo."bar" = 'foobar' 这样行。但是如果你有嵌套的对象呢?比如: class Foo { Bar bar } class Bar { String setMe } 现在我想使用动态设置,但是 Foo foo = new Foo() foo."bar.setMe" = 'Th
class Foo {
String bar
}
Foo foo = new Foo
foo."bar" = 'foobar'
这样行。但是如果你有嵌套的对象呢?比如:
class Foo {
Bar bar
}
class Bar {
String setMe
}
现在我想使用动态设置,但是
Foo foo = new Foo()
foo."bar.setMe" = 'This is the string I set into Bar'
返回MissingFieldException
有什么提示吗
更新:感谢Tim为我指明了正确的方向,上面的初始代码在检索属性方面非常有效,但我需要使用路径字符串设置值
以下是我从Tim建议的页面中得出的结论:
def getProperty(object, String propertyPath) {
propertyPath.tokenize('.').inject object, {obj, prop ->
obj[prop]
}
}
void setProperty(Object object, String propertyPath, Object value) {
def pathElements = propertyPath.tokenize('.')
Object parent = getProperty(object, pathElements[0..-2].join('.'))
parent[pathElements[-1]] = value
}
下面的操作正确
foo."bar"."setMe" = 'This is the string I set into Bar';
在不重写getProperty的情况下,您可以使用GString的“${}”语法获得与下面代码所示相同的结果
class Baz {
String something
}
class Bar {
Baz baz
}
class Foo {
Bar bar
}
def foo = new Foo()
foo.bar = new Bar()
foo.bar.baz = new Baz()
def target = foo
def path = ["bar", "baz"]
for (value in path) {
target = target."${value}"
}
target."something" = "someValue"
println foo.bar.baz.something
final println按预期打印“someValue”我能够通过构建并使用getProperty方法来完成任务,我将把答案放在上面,因为注释部分不太适合将代码放在这个优秀答案的一小部分中,以避免其他人在这一点上绊倒:您需要显式地使用
双引号,因为gstring(包含表达式)是这样定义的。但我想所有的groovy程序员都知道:)