作成 2002/11/6
更新 2003/2/14
JavaBeansというのは、とある決まりに従って書かれた小さいJavaクラスのことです。 クラスをJavaBeansとして作ると ポータブルで再利用可能になります。
とある決まり、というのは簡単に言うとこういうことです。
こんなのが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をつけます。
| プロパティー名 | ゲッタ | セッタ |
|---|---|---|
| message | getMessage | setMessage |
| aiueo | getAiueo | setAiueo |
というか、メソッド名のget、set以外の部分をプロパティー名 として扱います(フィールド名は関係ない)。
簡単に言うとそういうことですが、JavaBeans仕様には、その他、 イントロスペクションとかディスクリプターとかの機能もあります。 詳細はJDKドキュメントのJavaBeansTM Component APIのところに書いてます。 て、このページ見てる人にJavaBeansの説明なんかいらないですか。
PropertyUtilsクラスを使ってみます。
PropertyUtilsを使うために、操作されるBeanが必要なので、 以下のようなBeanを作りました。 このBeanは、
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のプロパティーを 文字列を引数として、取り出します。
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へプロパティーをコピーします。
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などの面白いクラスがありますが、 そのうち、もうちょっとさわってみようと思います。