Groovy:使用字符串作为路径设置动态嵌套方法

2023-11-23

我有一个对象内对象内对象的路径,我想使用 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。

有什么提示吗?

更新:感谢蒂姆为我指明了正确的方向,那里的初始代码非常适合检索属性,但我需要使用路径字符串设置值。

这是我从蒂姆建议的页面中得出的结论:

  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

最终 println 按预期打印“someValue”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Groovy:使用字符串作为路径设置动态嵌套方法 的相关文章

随机推荐

  • 如何使用类型特征进行条件编译?

    我正在尝试编写类似的代码here但使用 C 11 功能 不使用 Boost 工作自这个例子 我试图定义一个response trait 以及基于特征结果的条件编译 我怎样才能做到这一点 include
  • 从 XML 文档中获取指定的 Node 值

    我在浏览 XML 文档 使用 C 并获取所有必要的值时遇到问题 我成功地遍历了 XML 文档中所有指定的 XmlNodeList 成功获取了其中的所有 XmlNode 值 但我必须获取此 XmlNodeList 之外的一些值 例如
  • Webpack 和 angularJs

    我正在尝试使用 angularjs 和 webpack 运行简单的应用程序 这是我的代码 索引 html Full Name firstName lastName app js var app angular module myApp
  • 如何在 OAML 中读取位图?

    我想使用 OCAML 读取位图文件 从文件系统 并将像素 颜色 存储在具有位图维度的数组中 每个像素将占用数组中的一个单元格 我找到了这个功能Graphics dump image 图像 gt 颜色数组 数组但它不从文件中读取 影像影像应该
  • Python 正则表达式 \w 与组合变音符号不匹配?

    我有一个带有组合变音符号的 UTF8 字符串 我想将它与 w正则表达式序列 它匹配带有重音符号的字符 但如果存在带有组合变音符号的拉丁字符则不匹配 gt gt gt re match a w w wz u aoooz re UNICODE
  • jsonschema2pojo 不从 json 字符串生成 pojo 类

    我正在关注链接从 JSON 生成 Java 类 从 json 字符串 而不是从模式 创建 POJO 类 我正在使用 0 4 10 版本的 jsonschema2pojo jar 但无法生成 POJO 类 我的代码如下 public clas
  • 通过 RESTeasy 上的名称绑定将过滤器与特定方法匹配

    我正在尝试指定一个仅与我的某些 API 调用关联的预匹配过滤器 方法如下 RESTeasy 文档建议 我的代码如下所示 姓名绑定 NameBinding public interface ValidateFoo 资源 Path foo ba
  • NGINX 反向代理和访问控制允许来源问题

    我正在配置一个NGINX Reverse Proxy 在浏览器上我转到 客户端网址 https www hollywood com 那么上面的网页需要执行以下请求 服务器网址 https server hollywood com api a
  • sudoers NOPASSWD: sudo: 不存在 tty 且未指定 Askpass 程序

    我添加了一个这样的用户 adduser system home no home no create home group disabled password disabled login testuser 将用户添加到组中 adduser
  • scrapy中提取类名

    我正在尝试取消 trustpilot com 的评级 是否可以使用scrapy提取类名 我正在尝试抓取由五个单独图像组成的评级 但这些图像位于具有评级名称的类中 例如 如果评级为 2 则开始 div class star rating co
  • php:会话与数据库

    我有一个类从数据库中检索其成员 或多或少 10 个成员 我的问题是 每次从数据库 MySQL 获取它们 只在会话数组中留下一个ID 还是直接将它们存储在会话数组中 是否更有效 而且性能方面的差异这么大吗 假设数据库有 100 000 行 考
  • 将 R 诊断消息发送到 stdout 而不是 stderr

    寻找一个选项可以让我重定向 R 诊断消息 由message to stdout not stderr因为它是默认的 message手册指出 默认处理程序将消息发送到 stderr 连接 那么问题是如何改变这种默认行为 仍然保留重定向warn
  • 从 json 文件中读取多个元素

    我有一个 json 文件 其中包含许多如下元素 code hfuiew89 type location coordinates lat 40 9861 lon 29 1046 index 1 lat 40 9976 lon 29 1153
  • GO111MODULE=on(加载模块要求时出错)

    go get u github com junegunn fzf工作正常 但想像这样测试开发分支 gert gert GO111MODULE on go get u github com junegunn fzf devel go find
  • 具有多个数据源的工作单元?

    有可能 甚至很可能 我只是没有完全理解 工作单元 的概念 基本上 我将其视为面向对象环境中使用的广泛事务 启动工作单元 与对象交互 提交或回滚 但这如何分解为这些对象背后的数据存储上的实际事务呢 在具有单个 DB 和 ORM 例如 NHib
  • 在启动 Shiny 应用程序时更改 RStudio 窗口的大小

    我正在使用 RStudio IDE 来开发闪亮的应用程序 启动应用程序时 我通常使用 RunApp 按钮 在窗口中运行 这将在具有特定宽度和高度的窗口中打开应用程序 有没有办法更改此窗口的宽度 以便每次启动应用程序时都会显示在更宽的窗口中
  • C 中运行时的变量名、函数参数

    C 程序运行时是否可以知道函数参数和变量的名称类型 例如 如果我有一个函数 int abc int x float y somestruct z char a int b 我可以知道这个函数的内部吗abc 参数和变量的名称是什么i e 在这
  • Android+Gradle:将目录列出到文件中

    我正在尝试将 ANT 构建中的任务转换为 Gradle
  • 代理对象无法添加到 DOM(陷阱也不会触发)

    我正在尝试做一个Proxy object of Image捕获属性 但即使使用空处理程序 我也会收到错误消息 TypeError Node appendChild 的参数 1 未实现 Node 接口 代理对象应该充当目标对象 所以这让我有点
  • Groovy:使用字符串作为路径设置动态嵌套方法

    我有一个对象内对象内对象的路径 我想使用 Groovy 的动态功能来设置它 通常您只需执行以下操作即可做到这一点 class Foo String bar Foo foo new Foo foo bar foobar 这样就可以了 但是如果