5

我有一个 bean,我想通过反射访问它的属性。我收到字符串形式的属性名称。bean 具有用于其私有字段的 getter 方法。

我目前正在使用 获取该字段getDeclaredField(fieldName),通过使用使其可访问setAccessible(true),然后使用 检索其值get

另一种解决方法是将字段名称大写并添加get到它的前面,然后从类中获取该名称的方法,最后调用该方法以获取私有字段的值。

哪种方式更好?

编辑

也许我应该解释一下我所说的“更好”是什么意思……“更好”是指最佳实践。或者,如果有任何细微的警告或差异。

4

4 回答 4

2

您可能想看一下Introspector该类,如果您只想处理已公开的属性,它是一个很好的包装器,您可以获取一个BeanInfo对象然后调用getPropertyDescriptors(),例如:

final BeanInfo info = Introspector.getBeanInfo(clazz);
for (PropertyDescriptor prop : info.getPropertyDescriptors()) {
    final Method read = prop.getReadMethod();
    if (read != null) {
        // do something
    }
}
于 2010-09-03T16:12:40.020 回答
1

这取决于您的使用,但总的来说,我更喜欢使用 getter,因为这是“正常”的方式,并且在更多情况下会做类开发人员期望完成的事情。

原则上,如果类的开发者已经将该字段设为私有,他可以随意做任何事情,例如,如果它可以用其他方式计算,则稍后将其删除。然后,如果您在 3 个月后不走运而没有人记得时,那么现场访问将立即中断。

请注意,有一个像 apache commons BeanUtils 之类的库(我相信 Spring 中也有一个),它可以为您执行此操作并提供更健全的接口,例如哈希映射。

于 2010-09-03T16:08:32.630 回答
1

可能使用 getter 方法,因为除了返回属性值之外,它可能还有其他行为。但是,这取决于班级。

于 2010-09-03T16:11:49.050 回答
0

以什么方式更好?

你可以写一个 20 行的单元测试来看看哪个更快。您可以同时编写并查看它们,看看哪个更容易阅读。如果一种方法既容易阅读又更快,那就去吧。如果没有,你将不得不选择你的毒药......

于 2010-09-03T16:08:53.993 回答