Class RecursiveToStringStyle
- All Implemented Interfaces:
Serializable
- Direct Known Subclasses:
MultilineRecursiveToStringStyle
ToStringBuilder to create a "deep" toString.
To use this class write code as follows:
public class Job {
String title;
...
}
public class Person {
String name;
int age;
boolean smoker;
Job job;
...
public String toString() {
return new ReflectionToStringBuilder(this, new RecursiveToStringStyle()).toString();
}
}
This will produce a toString of the format: Person@7f54[name=Stephen,age=29,smoker=false,job=Job@43cd2[title=Manager]]
Graph safety: within one top-level toString() call, each object is rendered in detail at most once. A second (identity-equal) occurrence of an object
(whether through a true cycle or through a shared (acyclic) reference) is rendered in the abbreviated Object.toString() format instead of being
re-traversed. This keeps traversal cost linear in the size of the object graph; without it, shared references (reference "diamonds") would be re-traversed
exponentially. An optional output-length limit can be set via RecursiveToStringStyle.Builder.setMaxOutputLength(int); once the produced string
reaches the limit, further nested objects are replaced by a "...<truncated>" marker.
- Since:
- 3.2
- See Also:
-
Nested Class Summary
Nested Classes -
Field Summary
Fields inherited from class ToStringStyle
DEFAULT_STYLE, JSON_STYLE, MULTI_LINE_STYLE, NO_CLASS_NAME_STYLE, NO_FIELD_NAMES_STYLE, SHORT_PREFIX_STYLE, SIMPLE_STYLE -
Constructor Summary
ConstructorsConstructorDescriptionConstructs a new instance with no output-length limit.RecursiveToStringStyle(int maxOutputLength) Constructs a new instance with an output-length limit. -
Method Summary
Modifier and TypeMethodDescriptionprotected booleanTests whether or not to recursively format the givenClass.voidappendDetail(StringBuffer buffer, String fieldName, Object value) protected voidappendDetail(StringBuffer buffer, String fieldName, Collection<?> coll) Appends to thetoStringaCollection.protected voidappendInternal(StringBuffer buffer, String fieldName, Object value, boolean detail) Appends to thetoStringanObject, correctly interpreting its type.builder()Creates a newRecursiveToStringStyle.BuilderforRecursiveToStringStyleinstances.Methods inherited from class ToStringStyle
append, append, append, append, append, append, append, append, append, append, append, append, append, append, append, append, append, append, appendClassName, appendContentEnd, appendContentStart, appendCyclicObject, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendDetail, appendEnd, appendFieldEnd, appendFieldSeparator, appendFieldStart, appendIdentityHashCode, appendNullText, appendStart, appendSummary, appendSummary, appendSummary, appendSummary, appendSummary, appendSummary, appendSummary, appendSummary, appendSummary, appendSummary, appendSummarySize, appendSuper, appendToString, getArrayEnd, getArraySeparator, getArrayStart, getContentEnd, getContentStart, getFieldNameValueSeparator, getFieldSeparator, getNullText, getRegistry, getShortClassName, getSizeEndText, getSizeStartText, getSummaryObjectEndText, getSummaryObjectStartText, isArrayContentDetail, isDefaultFullDetail, isFieldSeparatorAtEnd, isFieldSeparatorAtStart, isFullDetail, isUseClassName, isUseFieldNames, isUseIdentityHashCode, isUseShortClassName, reflectionAppendArrayDetail, removeLastFieldSeparator, setArrayContentDetail, setArrayEnd, setArraySeparator, setArrayStart, setContentEnd, setContentStart, setDefaultFullDetail, setFieldNameValueSeparator, setFieldSeparator, setFieldSeparatorAtEnd, setFieldSeparatorAtStart, setNullText, setSizeEndText, setSizeStartText, setSummaryObjectEndText, setSummaryObjectStartText, setUseClassName, setUseFieldNames, setUseIdentityHashCode, setUseShortClassName
-
Constructor Details
-
RecursiveToStringStyle
public RecursiveToStringStyle()Constructs a new instance with no output-length limit. -
RecursiveToStringStyle
Constructs a new instance with an output-length limit.- Parameters:
maxOutputLength- once the produced string reaches this length, further nested objects are replaced by a"...<truncated>"marker;0means unlimited.- Since:
- 3.21.0
-
-
Method Details
-
builder
Creates a newRecursiveToStringStyle.BuilderforRecursiveToStringStyleinstances.- Returns:
- a new
RecursiveToStringStyle.BuilderforRecursiveToStringStyleinstances.
-
accept
-
appendDetail
Description copied from class:ToStringStyleAppends to thetoStringaCollection.- Overrides:
appendDetailin classToStringStyle- Parameters:
buffer- TheStringBufferto populate.fieldName- The field name, typically not used as already appended.coll- TheCollectionto add to thetoString, notnull.
-
appendDetail
Description copied from class:ToStringStyle- Overrides:
appendDetailin classToStringStyle- Parameters:
buffer- TheStringBufferto populate.fieldName- The field name, typically not used as already appended.value- The value to add to thetoString, notnull.
-
appendInternal
Appends to thetoStringanObject, correctly interpreting its type.This method performs the main lookup by Class type to correctly route arrays,
Collections,Maps andObjectsto the appropriate method.Either detail or summary views can be specified.
If a cycle is detected, an object will be appended with the
Object.toString()format.In addition to the cycle check performed by the superclass, this implementation keeps a per-thread set of objects already rendered in detail during the current top-level call. Values that this style would traverse structurally (see
accept(Class)) are rendered in detail at most once; later identity-equal occurrences are appended in the abbreviatedObject.toString()format. This bounds the traversal to one visit per object, so shared (acyclic) references cannot cause exponential re-traversal. If an output-length limit was configured and the buffer has reached it, a"...<truncated>"marker is appended instead of the value.- Overrides:
appendInternalin classToStringStyle- Parameters:
buffer- TheStringBufferto populate.fieldName- The field name, typically not used as already appended.value- The value to add to thetoString, notnull.detail- output detail or not.
-