我正在寻找在母对象中找到给定对象的属性名称的解决方案。我尝试遍历整个大厅,将母亲对象与具有is运算符的对象进行比较,但是我可以从母亲类中获取属性名称。
伪示例:
Class Boo {
List<B> bb_property = []
}
Class Foo {
List<A> a_property = []
List<B> b_property = []
Boo boo = new Boo()
}
Foo foo = new Foo()
List<A> randomname = foo.a_property
String propertyname = foo.findPropertyNameOf(randomname) //this is here where the magic should happen
assert propertyname == "a_property"
List<A> someOtherRandomName = foo.boo.bb_property
propertyname = foo.findPropertyNameOf(someOtherRandomName) //this is here where the magic should happen
assert propertyname == "bb_property"
答案 0 :(得分:1)
Groovy提供了多种方法来获取对象的属性。一种简单的方法是properties
方法,该方法返回名称到值的映射。
可以在这里看到: Groovy property iteration
然后您可以比较引用相等(我假设这是您想要的,而不是值相等): How can I perform a reference equals in Groovy?
您确实需要注意我们的周期,特别是使用诸如class
之类的属性时,肯定会引用其自身。
只需简单地避免class / metaClass和 not 全周期预防,就可以做到这一点:
Object.metaClass.findPropertyNameOf = { v ->
delegate.properties.collect { pn, pv ->
pv.is(v) ? pn : (pn in ["class", "metaClass"] ? null : pv.findPropertyNameOf(v))
}.find { it != null }
}