tips/JAVA/JavaBeans/Propertyのルール の変更点


#navi(../../)

* JavaBeans : Property のルール [#f17cb227]


** Property のルールを調べる [#l7aec771]

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

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

*** JavaBean からプロパティの定義を取得 [#r3837fa1]

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

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

*** 単純なプロパティと Indexed プロパティ [#vfa57076]

もっとも単純なケース=
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)