10

我有一个Person包含 3 个变量的 Java bean 类:

  • 名称(字符串)
  • 年龄(字符串)
  • 地址(对象)。

Address包含 3 个变量:

  • 街道
  • 门号
  • 城市

我想要一个实用程序,它应该在Person.

我的意思是它应该打印Person以及其中Address包含的对象。

我可以创建一个哈希图并使用反射放置变量名称和值,并在 JSP 中打印键/值 UI,但问题是我必须应用反射Address才能在哈希图中添加变量/值。

是否有可用的实用程序来执行此操作?

4

4 回答 4

37

您可以使用Apache Commons的ToStringBuilder

从文档:

此方法的典型调用如下所示:

 public String toString() {
   return ToStringBuilder.reflectionToString(this);
 }

更多细节:

此类可以为任何类或对象构建良好且一致的 toString()。此类旨在通过以下方式简化流程:

允许处理所有类型的字段名称 一致地处理空值 一致地输出数组和多维数组 允许为对象和集合控制详细级别 处理类层次结构 要使用此类,请编写如下代码:

 public class Person {
   String name;
   int age;
   boolean smoker;

   ...

   public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       append("smoker", smoker).
       toString();
   }
 }

或者,有一种方法使用反射来确定要测试的字段。因为这些字段通常是私有的,所以反射ToString 方法使用 AccessibleObject.setAccessible 来更改字段的可见性。除非正确设置了适当的权限,否则这将在安全管理器下失败。它也比显式测试慢。此方法的典型调用如下所示:

 public String toString() {
   return ToStringBuilder.reflectionToString(this);
 }
于 2012-07-26T12:27:16.397 回答
4

您可能正在寻找 Apache Commons ToStringBuilder#reflectionToString(Object)

于 2012-07-26T12:27:27.797 回答
2

您可能会发现 Jackson JSON 序列化程序对此很有用。Jackson 库可能已经成为您堆栈的一部分。如果没有,请在下面找到所需的依赖项。

private static final ObjectMapper OBJECT_MAPPER_SINGLETON = new ObjectMapper();
public static String toStringUsingJackson(final Object object) {
    try {
        return OBJECT_MAPPER_SINGLETON.writeValueAsString(object);
    } catch (final JsonProcessingException e) {
        return String.valueOf(object);
    }
}

样本输出:

{"name":"John Doe","age":42}

所需的 maven/gradle 依赖项

  • 杰克逊核心,groupId=com.fasterxml.jackson.core
  • 杰克逊数据绑定,groupId=com.fasterxml.jackson.core
于 2017-04-20T12:17:56.483 回答
1

您可以实现toString打印出任何您想要的方法,或者您可以使用 Apache Commons ToStringBuilder http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/builder/ToStringBuilder.html及其reflectionToString方法. 我不相信这会通过属性递归(例如地址),但如果你想看到用街道、门号和城市打印出来的地址,请使用实现它的toString方法来打印该信息。

于 2012-07-26T12:28:04.587 回答