マイナー・マイナー

隠れた名作の発掘が生きがい。

【Java】Beanのフィールドの値を一気に更新する


スポンサードリンク

JavaでBeanやDTOのフィールドの値を一気に更新したい。例えば、空文字が入っているString型のフィールドの値を一律nullにしたい。ただし、フィールドをひとつずつ見ていってnullにセットする処理はやりたくない。そんな要望を満たすべく、変数の値を一括で初期化するようなサンプルプログラムを書きました。


下記のようなBeanを考えます。

SampleBean.java

public class SampleBean {
    private String id;
    private String firstName;
    private String lastName;
    private int age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


Beanのフィールドのうち、String型で空文字""のものがあればnullに変更するプログラムを次のように書きました。リフレクションを使ってフィールドを取得し、そのフィールドのタイプと値を見て条件を判定し、条件に一致するものをnullに変更しています。

App.java

import java.lang.reflect.Field;

public class App {
    public static void main(String[] args) {
        SampleBean sampleBean = new SampleBean();
        sampleBean.setId("1234567");
        sampleBean.setFirstName("");
        sampleBean.setLastName("");
        sampleBean.setAge(31);

        System.out.println("---before---");
        System.out.println(sampleBean.getId());
        System.out.println(sampleBean.getFirstName());
        System.out.println(sampleBean.getLastName());
        System.out.println(sampleBean.getAge());

        try {
            for (Field field : sampleBean.getClass().getDeclaredFields()) {
                // String型以外はスキップ
                if (field.getType() != String.class) {
                    continue;
                }
                // String型、かつ、空文字であればnullを設定
                field.setAccessible(true);
                String value = (String) field.get(sampleBean);
                if ("".equals(value)) {
                    field.set(sampleBean, null);
                }
            }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        System.out.println("---after---");
        System.out.println(sampleBean.getId());
        System.out.println(sampleBean.getFirstName());
        System.out.println(sampleBean.getLastName());
        System.out.println(sampleBean.getAge());
    }
}


実行結果は次のようになりました。

---before---
1234567


31
---after---
1234567
null
null
31