tips/JAVA/JavaBeans/Propertyのルール
JavaBeans : Property のルール †
Property のルールを調べる †
JavaBeans の仕組では、getter や setter の名前、引数などを元に プロパティとして認識しますが、 具体的にどのようなルールで認識するのでしょうか。
実際に適当な JavaBean を作って試してみました。
JavaBean からプロパティの定義を取得 †
JavaBean にどのようなプロパティがあるかを調べるには java.beans パッケージの Introspector, BeanInfo を用いて次のように情報を取得します。
- Introspector#getBeanInfo(Class) で引数のクラスの BeanInfo を取得。 この BeanInfo に、クラスについての(JavaBean としての)情報が すべて格納されています。
- 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)