如何使用commons-lang3



我正在使用依赖项:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>

我有以下对象:

public Class X {
  private String a;
  private String b;
  private Y y;
}
public Class Y {
  private String c;
  private String d;
}

我需要递归地记录类X的内容,以获得类Y,并使用JSON样式。这就是我的目标,也是这个问题的目的。

方法1:

ToStringStyle style = ToStringStyle.JSON_STYLE;
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));

方法1结果:

{"a":"<a>","b":"<b>","y": com.<packages>.y@<hash>}

方法2:

RecursiveToStringStyle style = new RecursiveToStringStyle();
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));

方法2结果:

[com.<packages>.x@<hash>[a=<a>,b=<b>,y=com.<packages>.y@<hash>[c=<c>,d=<d>]]

成功的方法:

`Merge of Approach 1 and Approach 2` but how to achieve this? 

成功进近结果(我的目标):

{"a":"<a>","b":"<b>","y":{"c":"<c>","d":"<d>"}}

我找到了解决方案。我需要Override每个classes(在这种情况下为XY)的方法toString

public Class X {
  private String a;
  private String b;
  private Y y;
  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
  }
}
public Class Y {
  private String c;
  private String d;
  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
  }
}

现在,通过方法1,它正在发挥作用。

您可以扩展RecursiveToStringStyle类来编写自己的样式类,并设置参数以匹配JSON_style或任何其他样式。

class CustomStyle extends RecursiveToStringStyle {
    public CustomStyle() {
        super();
        super.setUseClassName(false);
        super.setUseIdentityHashCode(false);
        super.setContentStart("{");
        super.setContentEnd("}");
        super.setArrayStart("[");
        super.setArrayEnd("]");
        super.setFieldSeparator(",");
        super.setFieldNameValueSeparator(":");
        super.setNullText("null");
        super.setSummaryObjectStartText(""<");
        super.setSummaryObjectEndText(">"");
        super.setSizeStartText(""<size=");
        super.setSizeEndText(">"");
    }
}
public class Z {
    public String objectToString(Object obj) {
        ToStringStyle style = new CustomStyle();
        return new ReflectionToStringBuilder(obj, style).toString();
    }
}

要创建自定义样式,最好查看ToStringStyle类中设置的样式参数。您可以使用setter方法来自定义自定义实现中的默认设置。

我也遇到了类似的问题,因为它只影响一个字段,所以我最终这样做了(我实际上使用了SHORT_PREFIX_STYLE,但为了示例起见,我将其保留为JSON):

@Override
public String toString() {
    return (new ReflectionToStringBuilder(this, ToStringStyle.JSON_STYLE) {
        @Override
        protected Object getValue(Field field) throws IllegalArgumentException, IllegalAccessException {
            return "y".equals(field.getName()) ?
                ReflectionToStringBuilder.toString(y, ToStringStyle.JSON_STYLE) :
                super.getValue(field);
        }
    }).toString();
}

另一个原因是我无法控制字段y的源代码。

ToStringStyle的实例没有以某种可组合的方式设计,这太糟糕了。我认为递归根本不是"风格"的一部分,它是遍历的一个方面,应该独立建模)

相关内容

  • 没有找到相关文章

最新更新