tips/JAVA/JavaBeans/Propertyのルール

2008-08-14 (木) 13:41:51 (5726d)

JavaBeans : Property のルール

Property のルールを調べる

JavaBeans の仕組では、getter や setter の名前、引数などを元に プロパティとして認識しますが、 具体的にどのようなルールで認識するのでしょうか。

実際に適当な JavaBean を作って試してみました。

JavaBean からプロパティの定義を取得

JavaBean にどのようなプロパティがあるかを調べるには java.beans パッケージの Introspector, BeanInfo を用いて次のように情報を取得します。

  1. Introspector#getBeanInfo(Class) で引数のクラスの BeanInfo を取得。 この BeanInfo に、クラスについての(JavaBean としての)情報が すべて格納されています。
  2. BeanInfo#getPropertyDescriptors() で PropertyDescriptor の配列を取得。 それぞれの PropertyDescriptor が、プロパティ1つ1つをあらわしています。

単純なプロパティと Indexed プロパティ

もっとも単純なケース= 1つだけのオブジェクトを持つプロパティの場合、 getter は getXxx() のように引数無し、 setter は setXxx(String) のように引数を1つだけ持ちます。 (このとき、プロパティ名は xxx と解釈される)。

この場合、BeanInfo から取得できる PropertyDescriptor を使って、 PropertyDescriptor#getPropertyType() でプロパティの型を、 PropertyDescriptor#getReadMethod() で getter メソッド、 PropertyDescriptor#getWriteMethod() で setter メソッドを取得できます。

List や配列でプロパティを保持している場合も getXxx(), setXxx(List) のような getter, setter の組であれば 同様です。

一方、List や配列で値を保持している場合に getter を getXxx(int)、setter を setXxx(int, String) のように インデックス付きで定義することもできます。

この場合、プロパティ名は同じ xxx となりますが BeanInfo から取得できる PropertyDescriptor は PropertyDescriptor のインスタンスではなく、 そのサブクラスである IndexedPropertyDescriptor になります。

IndexedPropertyDescriptor のメソッドである getIndexedPropertyType() や getIndexedReadMethod(), getIndexedWriteMethod() などで、これら引数つきの getter, setter を 取得できます。

このとき、PropertyDescriptor のメソッドである getPropertyType() 等々の戻り値は null になるので注意してください。

では、同じプロパティに対して getXxx() と getXxx(int) のように、 引数なしとインデックス付きの両方の getter を設定したらどうなるのでしょうか。

(以下、未稿)

  • getXxx() が優先される
  • 実験した結果(サンプル Bean の PropertyDescriptor を print)