Java apache commons ReflectionToStringBuilder サンプルプログラム
ReflectionToStringBuilderの説明(google翻訳)
reflectionを使用してObject.toString()メソッドを実装するのに役立ちます。
このクラスはリフレクションを使用して、追加するフィールドを決定します。これらのフィールドは通常プライベートなので、クラスはAccessibleObject.setAccessible(java.lang.reflect.AccessibleObject []、boolean)を使用してフィールドの可視性を変更します。適切な権限が正しく設定されていない限り、セキュリティマネージャの下では失敗します。
リフレクションを使用して(プライベート)フィールドにアクセスすると、これらのフィールドへのアクセスを保護する同期保護が回避されます。 toStringメソッドがフィールドを安全に読み取ることができない場合は、toStringメソッドからそれを除外するか、メソッドの呼び出し前後でクラスのロック管理と一致する同期を使用する必要があります。 toStringメソッドの実行中に変更された場合、これらのクラスはConcurrentModificationExceptionをスローする可能性があるため、スレッドセーフではないコレクションクラスを除外するように特に注意してください。
このメソッドの典型的な呼び出しは次のようになります。
public String toString() {
return ReflectionToStringBuilder.toString(this);
}ビルダーを使用して、サードパーティのオブジェクトをデバッグすることもできます。
System.out.println(“An object: ” + ReflectionToStringBuilder.toString(anObject));
サブクラスはメソッドをオーバーライドすることでフィールド出力を制御できます。
accept(java.lang.reflect.Field)
getValue(java.lang.reflect.Field)
たとえば、このメソッドは返されたStringにpasswordフィールドを含めません。public String toString() {
return (new ReflectionToStringBuilder(this) {
protected boolean accept(Field f) {
return super.accept(f) && !f.getName().equals(“password”);
}
}).toString();
}あるいは、ToStringExcludeアノテーションを使用して、フィールドを結果に組み込むのを除外することができます。
toStringの正確な形式は、コンストラクタに渡されるToStringStyleによって決まります。
注:デフォルトのToStringStyleは「浅い」フォーマットのみを行います。つまり、合成オブジェクトはそれ以上トラバースされません。 「深い」書式を取得するには、RecursiveToStringStyleのインスタンスを使用します。
Object#toStringをオーバーライドする際の補助メソッドになります。
いちいち書くのが面倒なあなた向けのおすすめのソリューションです。
オブジェクトの内容を一発で出力してくれます。
形を変えれば、json形式でも出力が可能です。なんて便利。
ReflectionToStringBuilder
package jp.pjin.tech.java; import jp.pjin.tech.java.domain.Elephant; public class CommonsExample18 { public static void main(String[] args) throws Exception { Elephant e1 = new Elephant(); e1.setId(1); e1.setName("まーくん"); e1.setMail("elepahtn@pjin.jp"); e1.setPass("111222"); System.out.println(e1); System.out.println(e1.toJson()); } }
Elephant
package jp.pjin.tech.java.domain; import java.io.Serializable; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.builder.ToStringExclude; import org.apache.commons.lang3.builder.ToStringStyle; public class Elephant implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private String mail; @ToStringExclude private String pass; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } @Override public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE); } public String toJson() { return ReflectionToStringBuilder.toString(this, ToStringStyle.JSON_STYLE); } }
Elephantクラスに定義した4つのフィールドで、passに関しては、@ToStringExcludeアノテーションを付けています。
toStringを実行すると、@ToStringExcludeがついているもの以外が出力されます。
ToStringStyleには以下の7つのスタイルが用意されています。
- DEFAULT_STYLE
- JSON_STYLE
- MULTI_LINE_STYLE
- NO_CLASS_NAME_STYLE
- NO_FIELD_NAMES_STYLE
- SHORT_PREFIX_STYLE
- SIMPLE_STYLE