ToStringBuilerを使って簡単にBeanの中身を表示
偶数月はWEB+DBの月ということで、WEB+DB PRESS Vol.52を買ってきました。
- 作者: 矢野勉,庄司嘉織,ミック,鶴岡直也,伊藤直也,森田創,高林哲,小飼弾,羽生章洋,角田直行,はまちや2,kana,斉藤太郎,瀧内元気,青木靖,長野雅広,武者晶紀,川口耕介,冨田慎一,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2009/08/22
- メディア: 大型本
- 購入: 20人 クリック: 167回
- この商品を含むブログ (37件) を見る
id:Yoshioriとid:t_yanoの共著で書かれた、[新人さんに贈る]Javaプログラミングの習慣の中でcommons langのHashCodeBuilderとEqualsBuilderが紹介されていたので、便乗してToStringBuilderも便利ですよと紹介してみる。
準備
maven2で使うならcommons-langを追加するだけです。
<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency>
基本的な使い方
一番簡単な使い方はToStringBuilder#reflectionToString(Object object)を使う使い方です。以下のような感じ。
class Hoge { public Integer id = 1; public String value = "hoge"; public String[] strValues = new String[] { "aaa", "bbb", "ccc" }; public List<String> items = Arrays.asList("ddd", "eee", "fff"); @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }
とりえず出力してみる。
System.out.println(new Hoge());
出力結果はこんな感じ。
org.yamkazu.ToStringTest$Hoge@cafb56[id=1,value=hoge,strValues={aaa,bbb,ccc},items=[ddd, eee, fff]]
ちなみにprivateのフィールドもリフレクションで取得して表示してくれます。
出力形式を選択する
ToStringBuilder.reflectionToString(Object object, ToStringStyle style)を使うと第2引数に出力形式を選択できます。
DEFAULT_STYLE
上で示したデフォルトの出力スタイル。
@Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE); }
出力結果
org.yamkazu.ToStringTest$Hoge@cafb56[id=1,value=hoge,strValues={aaa,bbb,ccc},items=[ddd, eee, fff]]
MULTI_LINE_STYLE
@Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); }
出力結果
org.yamkazu.ToStringTest$Hoge@cf66b[ id=1 value=hoge strValues={aaa,bbb,ccc} items=[ddd, eee, fff] ]
NO_FIELD_NAMES_STYLE
@Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.NO_FIELD_NAMES_STYLE); }
出力結果
org.yamkazu.ToStringTest$Hoge@6f9b8e[1,hoge,{aaa,bbb,ccc},[ddd, eee, fff]]
SHORT_PREFIX_STYLE
@Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); }
出力結果
ToStringTest.Hoge[id=1,value=hoge,strValues={aaa,bbb,ccc},items=[ddd, eee, fff]]
SIMPLE_STYLE
@Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE); }
出力結果
1,hoge,{aaa,bbb,ccc},[ddd, eee, fff]
独自で拡張した場合は
いろいろあるけどDEFAULT_STYLEかなと個人的には思いますが、ToStringStyleクラスを継承すれば自前の出力形式を定義する事も簡単に出来ます。基本的にはコンストラクタの中でsetXXXを呼び出すと簡単に定義できます。この辺りは既存の定義クラスを参考にしてください。
特定のフィールドのみを出力対象にする
appendして行く方法
@Override public String toString() { return new ToStringBuilder(this) .append(id) .append(value) .toString(); }
フィールド名を出力したい場合はフィールド名も指定します。
@Override public String toString() { return new ToStringBuilder(this) .append("id", id) .append("value",value) .toString(); }
出力結果
org.yamkazu.ToStringTest$Hoge@aadc97[id=1,value=hoge]
ReflectionToStringBuilderを使う方法
toStringExcludeメソッドを使うと出力したくないフィールドを設定できます。
@Override public String toString() { return ReflectionToStringBuilder.toStringExclude(this, new String[] { "strValues", "items" }); }
出力結果はさっきと一緒。
org.yamkazu.ToStringTest$Hoge@aadc97[id=1,value=hoge]
スタイルを指定したいときは以下のようにすれば出来ます。
@Override public String toString() { return new ReflectionToStringBuilder(this,ToStringStyle.SIMPLE_STYLE) .setExcludeFieldNames(new String[] { "strValues", "items" }) .toString(); }
出力結果
1,hoge
いやー便利ですね。