如何使用反射或任何其他实用程序完全打印 Java Bean

问题描述 投票:0回答:4

我有一个 Java bean 类

Person
包含 3 个变量:

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

Address
包含3个变量:

  • 街道
  • 门号
  • 城市

我想要一个实用程序来打印

Person
中的所有变量。

我的意思是它应该打印

Person
以及其中包含的
Address
对象。

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

Address
在哈希映射中添加变量/值。

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

java jakarta-ee reflection javabeans
4个回答
38
投票

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

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

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

4
投票

您可能正在寻找 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);
    }
}

输出示例:

{“姓名”:“无名氏”,“年龄”:42}

必需的 maven/gradle 依赖项:

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

1
投票

您可以实现

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

© www.soinside.com 2019 - 2024. All rights reserved.