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

| 我的Web应用程序中有很多Java Bean类,我试图找到一种在这些Bean中实现
toString()
方法的简单方法。 “ 0”方法将用于记录整个应用程序,并应打印Bean中所有属性的“属性-值”对。 我正在尝试两种选择: 1.
BeanUtils.describe()
(Apache commons-beanutils) 2.
ReflectionToStringBuilder.toString()
(Apache commons-lang) 由于这是一个预期具有高流量的Web应用程序,因此该实现必须轻巧且不会影响性能。 (内存使用,处理器使用等是主要考虑因素)。 我想知道其中哪一个根据上述标准效果更好。据我所知,反射是一项繁重的工作,但是更多的细节和对这两个选项的深入了解将有助于我选择最佳解决方案。     
已邀请:
我们在对象的
toString()
方法中使用
ToStringBuilder.reflectionToString()
。在生产环境中,我们在运行时没有任何问题。当然,我们很少使用
toString()
方法。 我们也使用
BeanUtils.describe()
,但还有其他目的。
BeanUtils
使用
PropertyUtilsBean
保留已对其进行自省的Bean的内部缓存。看来这将使它比其他具有性能上的优势,但是在ReflectionToString源代码中有一点点探索,并且由于它最终依赖于
java.lang.Class
的实现,因此缓存也在那里起作用。 这两种方法看起来都是可行的选择,但是
BeanUtils.describe()
将返回Map属性,其中ReflectionToString将返回格式化的String。我猜这取决于您要对输出执行的操作。 我建议,如果您的应用程序严重依赖于在对象上调用“ 0”,那么使用特定的实现可能会更有利。     
就个人而言,我更喜欢使用Eclipse / IntelliJ生成toString()方法,然后根据需要对其进行修改(仅包括重要字段)。 右键单击->源->生成toString()。选择字段。做完了 比编写Builder代码所需的时间更少。 它将执行得更快。 它不使用高能离子空间(反射会吞噬高能离子) 如果您担心性能,那就是我要走的路。     
请注意,因为这是基于反射的,所以速度会很慢。 在最近的Web项目中,我们的基本实体toString()方法是ToStringBuilder.reflectionToString(this) 在保存期间(通过Spring Data JPA存储库)在休眠模式下调用此方法。我们有一个很大的带有嵌套列表的对象树,这导致保存期间的大量内存和CPU命中率。 它几乎使项目沉没了。     
只需在IDE中使用代码生成器即可生成toString()方法。这样,您将避免使用反射引起的开销。在实际的生产系统中,您的toString()方法可能经常被调用(100 /秒),从而导致垃圾收集器努力工作并暂停JVM。这些暂停可能是几秒钟或几十秒钟。     

要回复问题请先登录注册