【问题标题】:How to print Java Bean completely using reflection or any other utility如何使用反射或任何其他实用程序完全打印 Java Bean
【发布时间】:2012-07-26 12:24:32
【问题描述】:

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

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

Address 包含 3 个变量:

  • 街道
  • door_no
  • 城市

我想要一个实用程序来打印Person 中的所有变量。

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

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

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

【问题讨论】:

  • 这些对象上的#toString()不应该做什么?

标签: java jakarta-ee reflection javabeans


【解决方案1】:

你可以使用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();
   }
 }

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

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

【讨论】:

  • 您可以在 toString 方法之外使用 ToStringBuilder。 ToStringBuilder.reflectionToString(otherObject)
  • 你可以这样使用:ToStringBuilder.reflectionToString(objectRetrieved) 就像 Jeff 解释的那样
  • @FranciscoSpaeth 如果你有一个列表变量怎么办?列出 爱好;如何设置 toString?
  • 原生 List 实现已经存在一个toString(),它将输出一个由每个项目的toString()组成的字符串。在String 的情况下,将输出类似于[Item1, Item2, Item3] 的内容,因为它使用的是String 类的toString()。这意味着输出取决于该列表存储的对象类,因此您可能希望覆盖您的类的toString() 方法以获得良好的List 输出,这可以使用提供的答案来完成:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可能会发现 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}

    必需的 ma​​ven/gradle 依赖项

    • jackson-core, groupId=com.fasterxml.jackson.core
    • jackson-databind,groupId=com.fasterxml.jackson.core

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-05
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多