groovy - Groovy 元编程:覆盖 Map invokeMethod
问题描述
我有一个Map<String,Object>
使用 groovy 的魔法访问的 java
myMap.property1.nestedProperty1.nestedNestedProperty
这很棒,我知道我可以像这样安全地导航:
myMap?.property1?.nestedProperty1?.nestedNestedProperty
但是,当我遍历一个巨大的分层嵌套地图时,记住始终安全导航会变得乏味。
invokeMethod
我认为 groovy 通过使用覆盖来实现嵌套图导航。
对我来说,默认情况下修改该行为以安全导航的推荐/最佳方法是什么,而我不必?.
每次都这样做?
我打算只覆盖我的地图对象metaClass.invokeMethod
而不是第一类。
PS:我一直在徒劳地搜索groovy源代码。有人还可以指出 groovy 在 Java Map 实现中究竟在哪里实现了这个功能吗?
解决方案
您可能会尝试的一件事是使用 ConfigObject,它已经具有这种“安全性”。
ConfigObject conf = myMap as ConfigObject
现在你可以做conf.property1.nestedProperty1.nestedNestedProperty
,它总是会解决,即使原始地图中缺少任何级别。
但是,完成后的结果,如果缺少任何部分,则不是null
,它是一个 ConfigObject,其中isEmpty()
为真。如果你愿意,你可以使用它来测试它instanceof
,所以:
myMap?.property1?.nestedProperty1?.nestedNestedProperty
相当于:
ConfigObject conf = myMap as ConfigObject
Object value = conf.property1.nestedProperty1.nestedNestedProperty
value = (value instanceof ConfigObject ) ? null: value
您可以很容易地编写一个更干净地执行上述操作的方法。
http://docs.groovy-lang.org/2.4.9/html/gapi/groovy/util/ConfigObject.html
推荐阅读
- java - 如何使用变量访问 Java 数组元素?
- bash - 带有多行字符串和 for 循环的脚本
- typescript - 一种字段类型受第二个字段中指定的键名约束的通用类型
- c++ - 覆盖嵌套类的虚函数
- html - HTML 头部被渲染为文本
- xcode - 如何为 Mac 催化剂应用程序的 Xcode 位置调试加载 GPX 文件?
- php - 人类可读的字符串,表示从现在起多少天/小时/分钟
- amazon-web-services - AWS 启动模板:CoreCount 的值 4 不是 r5a.xlarge 实例类型的有效值。有效值为 [2]
- python - 努力阅读文本文件和使用嵌套循环
- html - CSS 选择器对 h1 标签不起作用