是否可以找到对象属性名称

时间:2018-08-01 11:40:27

标签: groovy

我正在寻找在母对象中找到给定对象的属性名称的解决方案。我尝试遍历整个大厅,将母亲对象与具有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"

1 个答案:

答案 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 }
}