2012年5月7日月曜日

JavaのIntrospectorを使うときに気をつけること。

クラスの情報を取得する際にIntrospectorのgetBeanInfoを使うと思うのだけど、

その際、気をつけないといけないことがある。


PropertyDescriptorクラスはプロパティ情報を格納している。その中にプロパティに対するgetterやsetter情報も格納しているのだけども、

収集する際にgetterとsetterは同じクラスを扱っていないとペアとはみなされないということ。


たとえば、setterが実装クラスを格納し、getterではそのスーパークラス、インターフェースを返すようなgetter、setterはペアとは判断されない。


以下検証ソース、setterはnullが格納されている。また、setterはIntrospector#getBeanInfoでは収集されていない。

public class IntrospectorTest {
public static void main(String[] args) throws Exception {

PropertyDescriptor pd = Introspector.getBeanInfo(
PropertyDescriptorTest.class).getPropertyDescriptors()[1];
System.out.println("getter: " + pd.getReadMethod());
System.out.println("setter: " + pd.getWriteMethod());

}

}
class PropertyDescriptorTest {

impl property;

public spec getProperty() {
return this.property;
}

public void setProperty(impl property) {
this.property = property;
}
}
class spec {}

class impl extends spec {}
実行結果:

getter: public spec PropertyDescriptorTest.getProperty()
setter: null

0 件のコメント:

コメントを投稿