首页 > 解决方案 > 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 实现中究竟在哪里实现了这个功能吗?

标签: groovymetaprogramming

解决方案


您可能会尝试的一件事是使用 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


推荐阅读