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