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

JDK 之 Java Bean 内省机制

javabean

为啥私有字段是类型私有的,而不是实例私有的?

记录使用Hibernate查询bean中字段和数据库列类型不匹配问题

Java中是不是可以通过反射访问私有字段[重复]