2011-08-05 106 views
0

我的问题是,是否有可能从JAVA中的类中提供不提供toString()方法的特定信息?将对象信息打印为toString()而不使用toString()?

存在一些问题:我们为我们的应用程序提供了一个记录器(使用aspectJ),它可以输出给定的特定参数。例如:

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

而且我们的记录仪打印出以下几点:

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

我们必须使用DataListModel级,因为我们在后台工作的JSF。但是,正如你所看到的,这个类不提供toString方法。

我们的记录器是由我们自己编写的,所以我们可以适应。是否有可能模拟toString方法,如:如果该类不提供toString,赶上他们所有的领域,并打印它们?

或者还有其他方法吗?

在此先感谢您的帮助。 问候,雷电

+0

这不是明显的谁“拥有” DataListModel类...但它听起来像你想要配置的方面,如果您不能添加自己的'toString'方法的东西。 –

回答

6

您可以使用ReflectionToStringBuilder。喜欢的东西:

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

不错,我不知道这存在。 – dfb

+0

这听起来很有希望,我会在星期一试一试!谢谢! – Thunderhook

5

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

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

谢谢,这件事已经在我脑海里了,我也会在星期一试试! – Thunderhook

相关问题