【发布时间】:2018-08-14 09:12:33
【问题描述】:
我有一个 Field f 某个类 MyClass 并且我想检索关联的 getter/setter(如果存在)。我该怎么做?
- 我检查了
Field的方法,但没有一个返回Method。 - 我玩过
BeanInfo检索到的Introspector.getBeanInfo(Class<?> beanClass)。它有一个方法getPropertyDescriptors(),它返回一个PropertyDescriptor的数组,每个PropertyDescriptor允许通过getReadMethod()和getWriteMethod()检索getter 和setter。但似乎与Field没有任何联系。此外,似乎不可能获得某个PropertyDescriptor(例如,通过将字段名称作为参数进行检索);所以即使有办法从PropertyDescriptor获取Field,我也需要遍历所有PropertyDescriptors。这不是高性能的。
注意:我不想依赖命名约定,所以请不要给出摆弄字段名称的答案。毕竟,没有名称 getMyField 或 isMyField 的字段 myField 的吸气剂仍然是吸气剂。
【问题讨论】:
-
字段的 getter 是基于 命名约定(标准或规范或任何可以调用的,JavaBeans 在这种特定情况下只是一个约定)。即使您有提供直接
field -> getter链接的工具,它也只是名称周围的快捷方式 -
我非常怀疑您是否可以在不依赖命名约定的情况下做到这一点(毕竟,这是我们知道它们是给定字段的 getter/setter 的唯一方法)。您必须自省类中每个方法的代码,接受该字段类型的单个参数或返回该类型。即便如此,你怎么知道他们只是设置者/获取者而不是有其他目的?毕竟,验证代码(在 setter 中)或延迟初始化代码(在 getter 中)看起来很像做其他事情的代码......
-
这个想法是,getter 和 setter 可能不直接对应于实际字段,它们可能是在其他地方派生、计算或存储的。换句话说,不一定有直接的对应关系,所以 Java 没有任何东西。
标签: java reflection field getter-setter member-variables