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