倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

commons-beanutils 基礎の基礎

前回は JavaBeans の定義と java.beans パッケージ内にある幾つかのクラスの使い方を解説しました。

今回は Apache Jakarta プロジェクトで開発されている、 Bean の取り扱いを簡単にするライブラリ commons-beanutils の基本的な使い方を見ていきます*1。 以下に出てくるのは PropertyUtils, BeanUtils, ConvertUtils です。 どれも org.apache.commons.beanutils パッケージ内のクラスで、ユーティリティ・クラス*2です。

ここでは、以下で使うサンプル Bean を定義しておきます(プロパティは name, age の2つ):

public class Person{
    private String name;
    private int age;

    public String getName(){return this.name;}
    public void setName(String name){this.name = name;}

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

PropertyUtils クラス


プロパティの取得・設定

Property とは JavaBeans のプロパティです。 プロパティの取得・設定には、PropertyUtils クラスの static メソッド getProperty(), setProperty() を用います。上記のサンプルを使って、これらの使い方を見てみましょう:

// サンプルの Bean
Person person = new Person();

// プロパティをセット
PropertyUtils.setProperty(person, "name", "倭マン");
PropertyUtils.setProperty(person, "age", 97);

// プロパティの取得
Object name = PropertyUtils.getProperty(person, "name");
Integer age = (Integer)PropertyUtils.getProperty(person, "age");

注意しておく必要があるのは、PropertyUtils#getProperty() メソッドの返り値が Object 型ってことぐらいでしょうか。

ちなみに、PropertyUtils#getPropertyType(Object, String) メソッドによって、プロパティの型を取得することも出来ます。

java.beans パッケージとの関連

PropertyUtils クラスには、java.beans パッケージ内のクラス PropertyDescriptorインスタンスを取得するメソッドがあります。

メソッドのシグニチャ 返り値 説明
getPropertyDescriptor(Object, String) PropertyDescriptor Bean オブジェクトとプロパティ名から PropertyDescriptor を取得します。
getPropertyDescriptor(Object) PropertyDescriptor[] Bean オブジェクトのプロパティに対する全 PropertyDescriptor を配列として返します。
getPropertyDescriptor(Class<?>) PropertyDescriptor[] Bean クラスに定義されているプロパティに対する全 PropertyDescriptor を配列として返します。


2つの getPropertyDescriptors() メソッドの違いは、引数が Object オブジェクトか Class オブジェクトかです。 Object オブジェクトが引数のメソッドは、そのオブジェクトから Class クラスを取得して、Class クラスが引数のメソッドを呼び出していると思えばよいでしょう:

/* 実際にこういう実装になっているとは限りませんが・・・ */
public static 
PropertyDescriptor[] getPropertyDescriptors(Object bean){
    return getPropertyDescriptors(bean.getClass());
}

BeanUtils クラス


プロパティの取得・設定

BeanUtils クラスでプロパティを扱う際にも、static メソッド getProperty(), setProperty() を用います。 一見 PropertyUtils クラスとの違いが分かりにくいかもしれませんが、根本的な違いはプロパティの値が Object オブジェクトではなく String オブジェクトであることです。

// サンプルの Bean
Person person = new Person();

// プロパティをセット
BeanUtils.setProperty(person, "name", "倭マン");
BeanUtils.setProperty(person, "age", "97");  // プロパティの値を文字列で渡す

// プロパティの取得
String name = BeanUtils.getProperty(person, "name");
String age = BeanUtils.getProperty(person, "age");  // 文字列 "97" が返される

文字列からオブジェクトへの変換

BeanUtils でプロパティの取得・設定をする際には、プロパティ値(Object 型)と文字列(String 型)との間で変換を行う必要があります。 これは ConvertUtils の static メソッドを用いて行われます(たぶん)。 もちろん、ユーザが ConvertUtils の static メソッドを使うことも出来ます。 デフォルトで変換がサポートされているデータ型は

です*3。 実際にどのように文字列へ変換(またはその逆)が行われるかの説明は割愛します。 プリミティブ型は通常の Java コード内のリテラルと同じです(たぶん)。

値を一括して設定する


プロパティのキーと値が java.util.Map 型で与えられているとき、Bean に一括してプロパティを設定することが出来ます。 これを実行するには、BeanUtils#populate() メソッドを用います:

// サンプルの Bean
Person person = new Person();

// サンプルの Map
Map<String, String> props = new HashMap<String, String>();
props.put(person, "name", "倭マン");
props.put(person, "age", "97");

// プロパティを一括セット
BeanUtils.populate(person, props);

Jakarta Commonsクックブック ―Javaプロジェクト必須のレシピ集

Jakarta Commonsクックブック ―Javaプロジェクト必須のレシピ集

*1:commons-beanutils-core バージョン 1.7.0。

*2:インスタンス化せずに、static メソッドのみを使うクラス。

*3:ConvertUtilsBean の JavaDoc 参照。 このドキュメント内では java.math.BigInteger, java.math.BigDecimaljava.lang パッケージとされてますが間違いです。