Groovy元编程:覆盖映射invokeMethod

时间:2019-05-08 21:07:47

标签: groovy metaprogramming

我有一个Java Map<String,Object>,我正在使用groovy的魔法来访问

myMap.property1.nestedProperty1.nestedNestedProperty

这很棒,我知道我可以像这样安全地导航:

myMap?.property1?.nestedProperty1?.nestedNestedProperty

但是,当我遍历巨大的分层嵌套地图时,记住始终保持安全的导航会变得乏味。

我认为groovy通过使用invokeMethod覆盖实现了嵌套图导航。

对于我来说,建议修改默认行为以使其默认安全导航而又不必每次都?.的最佳方法是什么?

我打算仅覆盖我的地图对象metaClass.invokeMethod,而不覆盖第一类。

PS:我一直在徒劳地搜索groovy源代码。有人还能指出在Java Map实现上groovy到底在哪里实现了此功能吗?

1 个答案:

答案 0 :(得分:1)

您可能会尝试使用ConfigObject,它已经具有这种“安全性”。

ConfigObject conf = myMap as ConfigObject

现在您可以执行conf.property1.nestedProperty1.nestedNestedProperty,即使原始地图中缺少任何级别,它也将始终解决。

但是,完成后的结果(如果缺少任何部分)不是null,而是isEmpty()为true的ConfigObject。您可以根据需要使用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