1

在我接手的项目中,我看到了很多以下内容:

log.debug(submitObject(" + object + ")");
log.debug(registerUser(" + user + ")");

等等。

在日志中,这会打印出如下内容:

SubmitObject(java.lang.Object@13a317a)

仅记录对象类型及其哈希码是否有用?假设我想知道用户对象的名称但我只有哈希码,我可以根据哈希码重建对象吗?

来自 object.toString() 的 javadoc

返回对象的字符串表示形式。通常,toString 方法返回一个“以文本方式表示”该对象的字符串。结果应该是一个简洁但信息丰富的表示,易于人们阅读。建议所有子类重写此方法。Object 类的 toString 方法返回一个字符串,该字符串由对象作为实例的类的名称、at 符号字符“@”和对象的哈希码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())
返回:对象的字符串表示。

我自己总是覆盖自定义对象的 toString() ,因此它会打印出对象的所有字段。我应该开始打印目标代码吗?

4

3 回答 3

1

不,继续覆盖更有用的 toString()。默认的 toString() 实际上没什么用,除了它至少显示了类实例是什么。

于 2013-09-26T14:39:41.877 回答
1

该哈希码是一个随机分配的值。仅当您想检查以前的日志中是否有相同的对象或不同的对象(即很少)时,它才有用

于 2013-09-26T14:52:35.873 回答
1

如果您无权访问源代码,或者您不想实现 toString 来更改现有代码,则可以使用 ReflectionToStringBuilderfrom 。org.apache.commons


例如:

if (LOGGER.isDebugEnabled()) {

  LOGGER.debug("User : "
    + reflectionToStringBuilder.toString(user ,
         ToStringStyle.MULTI_LINE_STYLE))

}

"LOGGER.isDebugEnabled()非常重要,因为toStringOperation 或反射ToStringBuilder 将在调用 log.debug 之前执行,因此您不希望进行如此昂贵的操作。

ReflectionToStringBuilderJavaDoc:http ://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/builder/ReflectionToStringBuilder.html

于 2013-09-26T15:07:35.653 回答