JavaBeans とは?
★JavaBeans の定義★
JavaBeans とは Bean と呼ばれるオブジェクトの仕様*1です。 そして、Bean とは、概ね以下の3つの条件を満たす Java クラスのことです:
● 引数のないコンストラクタが定義されている。
● プロパティに対して適切な命名規則に従ったアクセッサ・メソッド*2が定義されている。
● シリアライズ可能(java.io.Serializable を実装している)。
プロパティとは、private フィールドだと思ってください。 また、人によっては、「シリアライズ可能」という条件を外している人もいます。 現在では Bean と XML 文書間での入出力が規定されているので*3、基本的にはシリアライズ可能である必要はないかもしれません。
★アクセッサ・メソッドの命名規則★
定義の中の一番大事な項目は、「プロパティに対して適切な名前の getter / setter メソッドが定義されている」です。 命名規則は、文章で説明するより例を示した方が早いかと。
プロパティ名 | getter メソッド | setter メソッド | 備考 |
---|---|---|---|
name | String getName() | void setName(String) | - |
closed | boolean isClosed() | void setClosed(boolean) | boolean 型のプロパティ |
favoriteColor | String getFavoriteColor() | void setFavoriteColor(String) | 複数の単語からなるプロパティ名 |
ちなみに、プロパティの型は文字列やプリミティブ型、別の Bean などにすることが出来ます。
サンプル
後で使う簡単なサンプルを定義しておきましょう。 プロパティは name だけです。
public class Person{ private String name; /** getter メソッド */ public String getName(){ return this.name; } /** setter メソッド */ public void setName(final String name){ this.name = name; } }
以下のセクションで、このサンプルを用いて(直接アクセッサ・メソッドを呼び出さずに)Bean とプロパティ名からプロパティの取得、設定を行うサンプルを見ていきます。
java.beans パッケージを使う
基本的な流れは
- java.beans.PropertyDescriptor オブジェクトを生成する。
- アクセッサ・メソッドを取得する。
- 取得したメソッドを実行する。
です。 複数のプロパティを扱いたい場合は、個々のプロパティに対してこれを実行しなければなりません。
/* メソッド内 */ Person person = new Person(); // 1. PropertyDescriptor を取得する。 // IntrospectionException をキャッチする必要有り。 PropertyDescriptor nameDesc = new PropertyDescriptor("name", Person.class); // 2. アクセッサ・メソッドを取得する。 // 値を取得する際(getter メソッドが必要な場合)は // PropertyDescriptor#getReadMethod() を取得する。 Method setter = nameDesc.getWriteMethod(); // 3. アクセッサ・メソッドを実行する。 // IllegalAccessException, InvocationTargetException // をキャッチする必要有り setter.invoke(person, "倭マン");
★1つのクラスに対して複数のプロパティを扱う場合は・・・★
複数のプロパティを扱う場合は、java.beans.BeanInfo オブジェクトを使うと楽になる場合があるかもしれません。 BeanInfo オブジェクトは java.beans.Introspector クラスの static メソッドを使って取得します。
/* メソッド */ public BeanInfo getBeanInfo(final Class<?> beanClass){ try{ return Introspector.getBeanInfo(beanClass); }catch(final IntrospectionException ex){ // 適切に例外処理を。 throw new RuntimeException(ex); } }
BeanInfo オブジェクトから、(getPropertyDescriptors() メソッドを使って)その対象となる Bean に定義されている PropertyDescriptor 全てを取得できますが、プロパティ名をキーにしてその PropertyDescriptor オブジェクトを取得出来ないので、チョット使いにくいですね。
次回は Jakarta Commons プロジェクトで開発されている commons-beanutils の基礎の基礎をやりたいと思います。