当前位置: 首页 > 面试题库 >

Java toString-ToStringBuilder不够;不会遍历

班凌
2023-03-14
问题内容

我需要能够遍历整个对象图并记录所有成员字段的所有内容。

例如:对象A具有对象B的集合,而对象B具有对象C的集合,并且A,B,C上具有其他字段,等等。

Apache Commons
ToStringBuilder不够用,因为它不会遍历对象图或输出集合的内容。

有谁知道另一个将这样做的库,或者有一个这样做的代码段?


问题答案:

您可以使用遍历整个树org.apache.commons.lang.builder.ReflectionToStringBuilder。诀窍在于ToStringStyle您需要遍历值。ToStringStyle将处理已经处理的值,并且不允许递归。开始了:

System.out.println(ReflectionToStringBuilder.toString(schema, new RecursiveToStringStyle(5)));

private static class RecursiveToStringStyle extends ToStringStyle {

    private static final int    INFINITE_DEPTH  = -1;

    /**
     * Setting {@link #maxDepth} to 0 will have the same effect as using original {@link #ToStringStyle}: it will
     * print all 1st level values without traversing into them. Setting to 1 will traverse up to 2nd level and so
     * on.
     */
    private int                 maxDepth;

    private int                 depth;

    public RecursiveToStringStyle() {
        this(INFINITE_DEPTH);
    }

    public RecursiveToStringStyle(int maxDepth) {
        setUseShortClassName(true);
        setUseIdentityHashCode(false);

        this.maxDepth = maxDepth;
    }

    @Override
    protected void appendDetail(StringBuffer buffer, String fieldName, Object value) {
        if (value.getClass().getName().startsWith("java.lang.")
                    || (maxDepth != INFINITE_DEPTH && depth >= maxDepth)) {
            buffer.append(value);
        }
        else {
            depth++;
            buffer.append(ReflectionToStringBuilder.toString(value, this));
            depth--;
        }
    }

    // another helpful method
    @Override
    protected void appendDetail(StringBuffer buffer, String fieldName, Collection<?> coll) {
         depth++;
         buffer.append(ReflectionToStringBuilder.toString(coll.toArray(), this, true, true));
         depth--;
    }
}


 类似资料:
  • 20231022 10:00-10:30am 美团优选商品品类运营hr面 一共2面,这是最后一面。 整体感受:HR小姐姐敬业又专业,好像身体不舒服嗓子沙哑还在周日面试,介绍整体组织架构十分细致。 hr先进行了自我介绍,然后开始喊我: 1、自我介绍 2、你的过往经历中,你自己主动去做的职责之外的事情,举个例子 hr对整体组织架构进行了详细介绍,反问环节+面评。

  • 我正在使用Firestore&Java。我正在尝试通过查询和批处理更改多个值。 我的数据库 当我运行此代码时,我唯一的第一个值更新。我从未达到第二个值:/

  • 问题内容: 我正在尝试使用Sphinx在Python中记录5,000多个项目。它有大约7个基本模块。据我所知,为了使用自动文档,我需要为项目中的每个文件编写如下代码: 这太繁琐了,因为我有很多文件。如果我只想指定要记录的“ mods”包,那会容易得多。然后,Sphinx可以递归地浏览包并为每个子模块创建一个页面。 有这样的功能吗?如果没有,我可以编写一个脚本来制作所有.rst文件,但这将花费很多时

  • 问题内容: 我有以下for循环,当我用来删除项目时,然后得到的“秒数”是不确定的。我可以检查它是否未定义,但是我觉得可能有一种更优雅的方法来执行此操作。愿望是简单地删除一个项目并继续进行。 问题答案: 当您执行时,该数组将被重新索引,这意味着删除索引时将跳过索引,并且缓存已过时。 要解决此问题,您可能需要在后面减一,或者简单地反向迭代… 这样,重新索引不会影响迭代中的下一个项目,因为索引仅影响从当

  • 我试图使用本机查询从数据库中选择一些条件为true的列。当我击中邮递员的请求时,我得到了上面提到的错误。下面包括完整的日志。我在Java8上运行一个spring-boot应用程序,Db是PostgreSQL。请指出哪里出了问题,如何解决。 错误日志- 我在存储库中的查询- ScoreCardForSummary类- 存储库中的查询由服务层调用,服务层由控制器调用。请询问是否需要更多信息。 谢谢和问

  • 我有一个简单的bash脚本,它在设备列表中迭代,并对Android设备运行adb shell命令。代码如下: 运行时,代码将在一个设备上成功运行所有配置。插入两个设备时,输出读数如下: