我的Web应用程序中有很多Java bean类,并且我试图找到一种在这些bean中实现toString()
方法的简单方法。 toString()
方法将用于记录整个应用程序,并应打印Bean中所有属性的“属性-值”对。
我正在尝试两种选择:
1. BeanUtils.describe()
(Apache commons-beanutils)
2. ReflectionToStringBuilder.toString()
(Apache commons-lang)
由于这是一个预期具有高流量的Web应用程序,因此该实现必须轻巧且不会影响性能。 (内存使用,处理器使用等是主要考虑因素)。
我想知道其中哪一个根据上述标准效果更好。据我所知,反射是一项繁重的工作,但是更多的细节和对这两个选项的深入了解将有助于我选择最佳的解决方案。
最佳答案
我们在对象的ToStringBuilder.reflectionToString()
方法中使用toString()
。在生产环境中,我们在运行时没有任何问题。当然,我们很少使用toString()
方法。
我们还使用了BeanUtils.describe()
,但是还有另一个目的。 BeanUtils
使用PropertyUtilsBean
保留内部对其执行了自省(introspection)的bean的内部缓存。看来这将使它比其他具有性能上的优势,但是在ReflectionToString源代码中有一点点探索,并且由于它最终依赖于java.lang.Class
的实现,因此缓存也在那里发挥了作用。
这两种方法看起来都是可行的选择,但是BeanUtils.describe()
将返回属性映射,其中ReflectionToString将返回格式化的String。我猜这取决于您要对输出执行的操作。
我建议,如果您的应用程序严重依赖于在对象上调用toString()
,那么使用特定的实现可能会更有利。