BeanUtils与ReflectionToStringBuilder的性能(用于Bean类)

我的Web应用程序中有大量的Java bean类,我试图找到一种在这些bean中实现toString()方法的简单方法。 toString()方法将用于整个应用程序的日志记录,并应打印bean中所有属性的属性值对。

我正在尝试两种选择:
1. BeanUtils.describe() (Apache commons-beanutils)
2. ReflectionToStringBuilder.toString() (Apache commons-lang)

由于这是一个预计会有高流量的Web应用程序,因此实现必须是轻量级的,不应影响性能。 (内存使用,处理器使用等是主要考虑因素)。

我想根据上面提到的标准知道哪些更好。 据我所知,reflection是一项繁重的操作,但更多细节和对这两种选项的深入了解将有助于我选择最佳解决方案。

我们在对象的toString()方法中使用ToStringBuilder.reflectionToString() 。 我们在生产环境中没有遇到任何问题。 当然,我们很少使用toString()方法。

我们还使用BeanUtils.describe() ,但用于其他目的。 BeanUtils使用PropertyUtilsBean ,它保留了已执行内省的bean的内部缓存。 看起来这会给它带来性能优势,但是在reflectionToString源代码中有点蠢蠢欲动,似乎因为它最终依赖于java.lang.Class的实现,所以缓存也在那里发挥作用。

要么看起来是可行的选择,但BeanUtils.describe()将返回属性Map,其中reflectionToString将返回格式化的String。 我想这取决于你想要对输出做什么。

我建议如果你的应用程序严重依赖于在对象上调用toString() ,那么具有特定的实现可能会更有益。

就个人而言,我更喜欢使用Eclipse / IntelliJ生成toString()方法,然后根据需要进行修改(仅包括重要的字段)。

右键单击 – > Source – > Generate toString()。 选择字段。 完成。

  1. 它甚至比编写Builder代码花费的时间更少。
  2. 它会执行得更快。
  3. 它不使用permgen空间(reflection可能倾向于吃掉permgen)

如果你担心表现,这就是我要走的路。

要小心,因为这是基于reflection的,它会很慢。

在最近的一个Web项目中,我们的Base实体toString()方法是ToStringBuilder.reflectionToString(this)

在保存期间(通过Spring Data JPA存储库)在hibernate中调用此方法。 我们有一个包含嵌套列表的大型对象树,导致在保存期间内存和CPU命中率都很高。

它差点沉没了这个项目。

只需在IDE中使用代码生成器即可生成toString()方法。 这样您就可以避免使用reflection造成的开销。 在实际生产系统中,可以经常调用toString()方法(100 / sec),导致垃圾收集器努力工作并暂停JVM。 这些暂停可能是几秒或几十秒。