如何通过字符串形式的属性名访问对象属性?
字符串属性名访问Groovy对象属性的更优方案
你多虑了,确实有比遍历metaPropertyValues列表更高效简洁的方法,以下是几种常用方案:
1. 直接使用Groovy内置方法
Groovy所有对象都自带getProperty()和setProperty()方法,专门用于通过字符串动态访问属性:
- 获取属性值:
def value = obj.getProperty('propertyName') - 设置属性值:
obj.setProperty('propertyName', newValue)
这种方式无需遍历列表,内部直接映射到目标属性,效率远高于遍历查找。
2. 下标操作符语法糖
Groovy支持用下标操作符简化属性访问,本质是上述方法的语法糖,写法更简洁:
- 获取属性值:
def value = obj['propertyName'] - 设置属性值:
obj['propertyName'] = newValue
3. 缓存属性映射(适用于多次访问场景)
如果需要频繁通过字符串访问不同属性,可以提前将metaPropertyValues转换为Map缓存,避免重复遍历列表:
// 一次性转换为Map,后续访问直接取值 def propertyMap = obj.metaPropertyValues.collectEntries { [it.name, it] } // 获取属性值 def value = propertyMap['propertyName'].value // 设置属性值 propertyMap['propertyName'].value = newValue
转换后每次访问都是O(1)的时间复杂度,比反复调用find遍历列表高效得多。
4. 通过metaClass获取元属性
利用对象的metaClass直接获取指定元属性,内部通常带有缓存机制,性能更优:
def metaProperty = obj.metaClass.getMetaProperty('propertyName') // 获取属性值 def value = metaProperty.getProperty(obj) // 设置属性值 metaProperty.setProperty(obj, newValue)
内容的提问来源于stack exchange,提问作者Choosechee
相关产品推荐
相关产品推荐

