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

Thu*_*ook 0 java logging tostring simulate

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

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

public void addGroupMembers(Group group, String doneBy, DataListModel<User> users) {
    doSomething()
}
Run Code Online (Sandbox Code Playgroud)

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

addGroupMembers called with given arguments:
Group = [id = ..... and so on]
username
DataListModel$1231 <-
Run Code Online (Sandbox Code Playgroud)

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

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

或者还有其他方法吗?

在此先感谢您的帮助.问候,雷霆

Bri*_*ent 7

您可以使用ReflectionToStringBuilder.就像是:

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


dfb*_*dfb 6

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

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