「ReflectionToStringBuilder」は、Commons Langのクラス。
リフレクションを用いてフィールドの内容を取得するので
toString()メソッドを1行で書くことができる。

クラスの状態をログに書き出す場合など、
toString()を定義しておくと便利。

ただ、新しいクラスやフィールドの変更で
毎回toString()を書き直すのは心が折れる。

そこで、リフレクションを使ってフィールドの内容を出力する
ReflectionToStringBuilderが便利。

使い方

1行加えるだけ

次のようにtoString()をオーバーライドするだけで簡単に使える。

@Override public String toString() {
    return ReflectionToStringBuilder.toString(this);
}
出力
Person@182f0db[name=John Doe,age=33,smoker=false]

出力形式をカスタマイズする

デフォルトの出力内容が気にいらないときは、
ToStringStyleを指定することで出力形式を変更することができる。

ToStringStyleにはいくつか定義済みのものがあるので
それを使う。

例.ToStringStyleの設定
@Override public String toString() {
   final ToStringStyle style = ToStringStyle.SIMPLE_STYLE;
   return ReflectionToStringBuilder.toString(this,style);
}
主なスタイル
スタイル 出力形式
ToStringStyle.DEFAULT_STYLE Person@182f0db[name=John Doe,age=33,smoker=false]
ToStringStyle.NO_FIELD_NAMES_STYLE Person@182f0db[John Doe,33,false]
ToStringStyle.SHORT_PREFIX_STYLE Person[name=John Doe,age=33,smoker=false]
ToStringStyle.SIMPLE_STYLE John Doe,33,false

スタイルの他にも、出力する項目などある程度自由に設定することが可能。

注意

循環参照に注意する

リフレクションを使っている性質上、
循環参照に注意しなくてはいけない。

例えばA→B・B→Aのような参照があるクラス同士の場合は、
循環参照になり無限ループになってしまう。

このような場合は、setExcludeFieldNames()メソッドをもちいて
toString()の対象から除外することで回避できる。

またsetExcludeFieldNames()は、
パスワードなど意図的に伏せたいフィールドを除外するときなども利用できる。

@Override public String toString() {
    ReflectionToStringBuilder builder = new ReflectionToStringBuilder(this);
    builder.setExcludeFieldNames("password");
    return builder.toString();
}
 

PR