打印对象信息asString()没有toString()?

时间:2011-08-05 16:54:48

标签: java logging tostring simulate

我的问题是,是否可以从JAVA中没有提供toString()方法的类中打印出特定信息?

有一个问题:我们为我们的应用程序提供了一个记录器(使用aspectJ),它打印出给定的特定参数。例如:

public void addGroupMembers(Group group, String doneBy, DataListModel<User> users) {
    doSomething()
}

我们的Logger打印出以下内容:

addGroupMembers called with given arguments:
Group = [id = ..... and so on]
username
DataListModel$1231 <-

我们必须使用DataListModel-Class,因为我们在后台使用JSF。但是,正如您所看到的,此类不提供toString方法。

我们的记录器由我们自己编写,因此我们可以适应它。是否可以模拟一个toString方法:如果类没有提供toString,捕获所有字段并打印它们?

或者还有其他方法吗?

提前感谢您的帮助。 问候,雷霆

2 个答案:

答案 0 :(得分:7)

您可以使用ReflectionToStringBuilder。类似的东西:

if (object.toString().endsWith("@" + Integer.toHexString(object.hashCode())) {
  // default toString()...
  return ReflectionToStringBuilder.toString(object);
}
else {
  return object.toString();
}

答案 1 :(得分:6)

我用反射做过几次。我有一个基本上dumpObject的泛型方法,它迭代遍历字段并将它们放到一个字符串中。这很好用,但如果你经常调用它,一定要考虑性能 - 硬编码tostring可能会更好。如,

    for (Field field : obj.getClass().getDeclaredFields()) {
        field.setAccessible(true); 
        log.info(field.getName()
                 + " - " + field.getType()
                 + " - " + field.get(obj));
    }