作成 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などの面白いクラスがありますが、 そのうち、もうちょっとさわってみようと思います。