我在接手的项目中看到了很多以下几行:
log.debug(submitObject(" + object + ")");
log.debug(registerUser(" + user + ")");
等等。
在日志中打印出如下内容:
SubmitObject(java.lang.Object@13a317a)
仅记录对象类型及其哈希码是否有用?假设我想知道用户对象的名称,但我只有哈希码,是否可以根据哈希码重建对象?
来自object.toString()的javadoc
返回对象的字符串表示形式。一般来说, toString方法返回一个“文本表示”的字符串 宾语。结果应该是简洁但信息丰富的表示 一个人很容易阅读。建议所有人 子类重写此方法。类Object的toString方法 返回一个字符串,该字符串由其类的名称组成 object是一个实例,at符号字符“@”和unsigned 对象哈希码的十六进制表示。其他 单词,此方法返回一个等于值的字符串:
getClass()。getName()+'@'+ Integer.toHexString(hashCode())
返回:对象的字符串表示。
我自己总是覆盖自定义对象的toString(),因此它会打印出对象的所有字段。我应该开始打印目标代码吗?
答案 0 :(得分:1)
不,继续覆盖toString(),这更有用。默认的toString()实际上是无用的,除了它至少显示了类实例是什么。
答案 1 :(得分:1)
该哈希码是随机分配的值。只有当你想检查你在之前的日志中有相同的对象或者不同的对象(即很少)时,它才有用
答案 2 :(得分:1)
如果您无权访问源代码,或者您不希望使用toString实现更改现有代码,则可以使用ReflectionToStringBuilder
中的org.apache.commons
。
例如:
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("User : "
+ reflectionToStringBuilder.toString(user ,
ToStringStyle.MULTI_LINE_STYLE))
LOGGER.debug("User : "
+ reflectionToStringBuilder.toString(user ,
ToStringStyle.MULTI_LINE_STYLE))
}
非常重要,因为"LOGGER.isDebugEnabled()
操作或者reflectionToStringBuilder将在调用log.debug之前执行,因此您不需要这么昂贵的操作。
toString
JavaDoc:http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/builder/ReflectionToStringBuilder.html