Commons

作成 2002/11/6
更新 2003/2/14

BeanUtils

BeanUtilsって?

BeanUtilsはJavaBeansを扱うユーティリティーAPIを提供しています。

JavaBeansって?

JavaBeansというのは、とある決まりに従って書かれた小さいJavaクラスのことです。 クラスをJavaBeansとして作ると ポータブルで再利用可能になります。

とある決まり、というのは簡単に言うとこういうことです。

  1. 引数なしコンストラクタがある
  2. 命名規則に沿ったゲッタ、セッタがある
  3. 直列化可能(Serializebleなど)である

こんなのがJavaBeanです。

public class SomeBean{
  private String message;
  public SomeBean(){//←引数なしコンストラクタ(省略可)
  }
  public String getMessage(){//←ゲッタ
    return message;
  }
  public void setMessage(String message){//←セッタ
    this.message = message;
  }
}

implements Serialziable等宣言し、直列化可能にするのは必須ではありません(上の例でも直列可能ではありません)。ただし、リモート転送やファイル保存には必要です。また一般に、クラスはpublicにしパッケージ宣言も行います(リフレクションでJavaBeansのインスタンスを作ったり操作したりするため)。

命名規則というのは、 getXxx()、setXxx(...)というやつです。 プロパティー名の頭文字を大文字にして、get、setをつけます。
プロパティー名ゲッタセッタ
messagegetMessagesetMessage
aiueogetAiueosetAiueo

というか、メソッド名のget、set以外の部分をプロパティー名 として扱います(フィールド名は関係ない)。

簡単に言うとそういうことですが、JavaBeans仕様には、その他、 イントロスペクションとかディスクリプターとかの機能もあります。 詳細はJDKドキュメントのJavaBeansTM Component APIのところに書いてます。 て、このページ見てる人にJavaBeansの説明なんかいらないですか。

PropertyUtils

PropertyUtilsクラスを使ってみます。

PropertyUtilsを使うために、操作されるBeanが必要なので、 以下のようなBeanを作りました。 このBeanは、

をプロパティーとして持っています。

HogeBean.java

public class HogeBean {

  private String message;
  private String[] array;
  private HogeBean child;
  
  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }

  public String[] getArray() {
    return array;
  }

  public HogeBean getChild() {
    return child;
  }

  public void setArray(String[] array) {
    this.array = array;
  }

  public void setChild(HogeBean child) {
    this.child = child;
  }
}

以下のTest1クラスではBeanUtilsを使って、Beanのプロパティーを 文字列を引数として、取り出します。

Test1.java

import org.apache.commons.beanutils.PropertyUtils;

public class Test1 {

  public static void main(String[] args) throws Exception{
    HogeBean bean = new HogeBean();
    bean.setMessage("hello");
    bean.setArray(new String[]{"1","2","3"});
    bean.setChild(bean);

    Object message = PropertyUtils.getProperty(bean, "message");
    System.out.println(message);

    Object array1 = PropertyUtils.getProperty(bean, "array[1]");
    System.out.println(array1);

    Object childMessage = PropertyUtils.getProperty(bean, "child.message");
    System.out.println(childMessage);
  }
}

配列のインデックスは"[]"、ネストした他のBeanは"."(ドット)で指定します。 このように名前で指定して何がうれしいかというと、 まあ、JSPのカスタムタグなどで使えるわけです (というかそのために作られたもの?)。

次のTest2クラスでは、BeanからBeanへプロパティーをコピーします。

Test2.java

import org.apache.commons.beanutils.PropertyUtils;

public class Test2 {

  public static void main(String[] args) throws Exception{

    HogeBean bean = new HogeBean();
    bean.setMessage("hello");
    bean.setArray(new String[]{"1","2","3"});
    bean.setChild(bean);

    HogeBean bean2 = new HogeBean();

    PropertyUtils.copyProperties(bean2, bean);
    System.out.println(bean2.getMessage());

  }
}

これはけっこう使えます。 イチイチ、フィールド全部こっちからセット、こっちにゲットってせずにすみます。 ちなみに上の例だとclone()とかすれば一緒ですが、 クラスが異なってもプロパティーでコピーできるところが違います。

ちなみに同じ毛色のユーティリティークラスにBeanUtilsというのがあります。 PropertyUtilsのgetProperyXXX()メソッドが Object型を返す(型変換を行わない)のに対して、BeanUtilsのgetPropertyXXX()メソッドは、String型を返します。タグライブラリなどで Stringの返り値の方が望ましい場合に使われます(たぶん)。

BeanUtilsのソースはリフレクションのいいサンプルなので、 興味のある人は覗いてみるといいかも。 BeanUtilsには、その他DynaBeanなどの面白いクラスがありますが、 そのうち、もうちょっとさわってみようと思います。


TOP