Groovy:使用string作为路径设置动态嵌套方法
发布时间:2020-12-14 16:27:25 所属栏目:大数据 来源:网络整理
导读:我有一个对象内对象的路径,我想使用Groovy的动态能力来设置它.通常只需执行以下操作即可: class Foo { String bar}Foo foo = new Foofoo."bar" = 'foobar' 这很好用.但是如果你有嵌套对象怎么办?就像是: class Foo { Bar bar}class Bar { String setMe}
我有一个对象内对象的路径,我想使用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" = '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” (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |