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