bean 中私有字段的 getDeclaredField(String) 与 getMethod(String)
Posted
技术标签:
【中文标题】bean 中私有字段的 getDeclaredField(String) 与 getMethod(String)【英文标题】:getDeclaredField(String) vs. getMethod(String) for private fields in a bean 【发布时间】:2011-04-07 22:36:05 【问题描述】:我有一个 bean,我想通过反射访问它的属性。我收到字符串形式的属性名称。 bean 具有用于其私有字段的 getter 方法。
我目前正在使用getDeclaredField(fieldName)
获取该字段,通过使用setAccessible(true)
使其可访问,然后使用get
检索其值。
另一种方法是将字段名称大写并在其前面添加get
,然后从类中获取该名称的方法,最后调用该方法以获取私有值字段。
哪种方式更好?
编辑
也许我应该解释一下我所说的“更好”是什么意思……“更好”是指最佳实践。或者,如果有任何细微的警告或差异。
【问题讨论】:
【参考方案1】:这取决于您的用途,但总的来说,我更喜欢使用 getter,因为这是“正常”的方式,并且在更多情况下会做类开发人员期望完成的事情。
原则上,如果类的开发者已将字段设为私有,他可以随意做他想做的事,例如,如果可以用其他方式计算,稍后将其删除。如果 3 个月后你不走运,当没人记得了时,字段访问将立即中断。
请注意,有一个像 apache commons BeanUtils 之类的库(我相信 Spring 中也有一个),它可以为您做到这一点并提供更健全的接口,例如哈希映射。
【讨论】:
感谢您提及BeanUtils
。我不知道。我的下一个问题是是否有图书馆这样做。我不想重新发明***。 :)
接受这个答案,因为它直接回答了我原来的问题。【参考方案2】:
在什么方面更好?
您可以编写一个 20 行的单元测试,看看哪个更快。您可以同时编写并查看它们,看看哪个更容易阅读。如果一种方法既容易阅读又更快,那就去吧。如果没有,你将不得不选择你的毒药......
【讨论】:
【参考方案3】:可能使用 getter 方法,因为它可能除了返回属性值之外还有其他行为。但是,这取决于班级。
【讨论】:
【参考方案4】:您可能想看看Introspector
类,如果您只想处理已公开的属性,它是一个很好的包装器,您可以获取BeanInfo
对象,然后调用getPropertyDescriptors()
,用于示例:
final BeanInfo info = Introspector.getBeanInfo(clazz);
for (PropertyDescriptor prop : info.getPropertyDescriptors())
final Method read = prop.getReadMethod();
if (read != null)
// do something
【讨论】:
谢谢!正是我想要的。以上是关于bean 中私有字段的 getDeclaredField(String) 与 getMethod(String)的主要内容,如果未能解决你的问题,请参考以下文章
在servlet中从数据库中获取完整的行并使用bean类将它们传递给jsp