getDeclaredField(String)与bean中私有字段的getMethod(String)

时间:2010-09-03 16:02:54

标签: java reflection getmethod

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

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

另一种方法是将字段名称大写并在其前面添加get,然后从该类中获取该名称的方法,最后调用该方法获取值私人领域。

哪种方式更好?

修改

也许我应该用“更好”来解释我的意思......通过“更好”,我的意思是在最佳实践意义上。或者,如果有任何微妙的警告或差异。

4 个答案:

答案 0 :(得分:2)

您可能需要查看Introspector类,如果您只想处理已公开的属性,那么它是一个不错的包装器,您可以获取BeanInfo对象,然后调用{ {3}},例如:

final BeanInfo info = Introspector.getBeanInfo(clazz);
for (PropertyDescriptor prop : info.getPropertyDescriptors()) {
    final Method read = prop.getReadMethod();
    if (read != null) {
        // do something
    }
}

答案 1 :(得分:1)

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

原则上,如果班级的开发人员将该字段设为私有,则他可以随心所欲地进行操作,例如,如果可以以其他方式计算,则可以稍后将其删除。如果3个月后再也没人记得那么你不幸的话,那么现场接通将会立即破裂。

请注意,像apache commons BeanUtils这样的库(我相信Spring中也有一个)可以为你做这个并提供更理智的界面,例如哈希映射。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

更好的方式?

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