加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读