我有一个bean,我想通过反射访问它的属性。我以字符串形式接收属性名称。 bean有私有字段的getter方法。
我目前正在使用getDeclaredField(fieldName)
获取该字段,使用setAccessible(true)
访问该字段,然后使用get
检索其值。
另一种方法是将字段名称大写并在其前面添加get
,然后从该类中获取该名称的方法,最后调用该方法获取值私人领域。
哪种方式更好?
修改
也许我应该用“更好”来解释我的意思......通过“更好”,我的意思是在最佳实践意义上。或者,如果有任何微妙的警告或差异。
答案 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行单元测试以查看哪个更快。您可以同时编写它们并查看它们以查看哪个更易于阅读。如果一种方法既易于阅读又更快,那就去吧。如果没有,你将不得不挑选毒药......