2010-12-14 57 views
1

J'ai lu les spécifications JavaBeans mais je n'ai trouvé nulle part ce comportement. Est-ce un bug?JavaBeans Introspector ne trouve pas correctement la propriété avec le type de hiérarchie d'interface

  • testPropertyType échoue parce attend Data classe

  • testPropertyReadable réussir parce que DefaultBean.getMyData returning Data méthode existe

  • testPropertyWritable échoue parce qu'aucune méthode DefaultBean.setMyData(Data) n'existe pas

Testé sur JavaSE 6

import java.beans.BeanInfo; 

import java.beans.Introspector; 

import java.beans.PropertyDescriptor; 

import org.junit.Test; 

public class DefaultBeanTest { 

    @Test 
    public void testPropertyType() 
     throws Exception 
    { 
     final BeanInfo beanInfo = Introspector.getBeanInfo(DefaultBean.class); 
     for (final PropertyDescriptor property : beanInfo.getPropertyDescriptors()) { 
      if ("class".equals(property.getName())) { 
       continue; 
      } 

      if ("myData".equals(property.getName())) { 
       if (!property.getPropertyType().equals(ModifiableData.class)) { 
        throw new AssertionError("expects " + ModifiableData.class + " but was " 
          + property.getPropertyType()); 
       } 
      } 
     } 
    } 


    @Test 
    public void testPropertyReadable() 
     throws Exception 
    { 
     final BeanInfo beanInfo = Introspector.getBeanInfo(DefaultBean.class); 
     for (final PropertyDescriptor property : beanInfo.getPropertyDescriptors()) { 
      if ("class".equals(property.getName())) { 
       continue; 
      } 

      if ("myData".equals(property.getName())) { 
       if (property.getReadMethod() == null) { 
        throw new AssertionError("expects read method"); 
       } 
      } 
     } 
    } 


    @Test 
    public void testPropertyWritable() 
     throws Exception 
    { 
     final BeanInfo beanInfo = Introspector.getBeanInfo(DefaultBean.class); 
     for (final PropertyDescriptor property : beanInfo.getPropertyDescriptors()) { 
      if ("class".equals(property.getName())) { 
       continue; 
      } 

      if ("myData".equals(property.getName())) { 
       if (property.getWriteMethod() == null) { 
        throw new AssertionError("expects write method"); 
       } 
      } 
     } 
    } 


    static interface Data { 

    } 

    static interface ModifiableData 
      extends Data { 
    } 

    static class DefaultData 
      implements ModifiableData { 

    } 

    static interface Bean { 

     Data getMyData(); 

    } 

    static interface ModifiableBean 
      extends Bean { 

     ModifiableData getMyData(); 


     void setMyData(
       ModifiableData data); 
    } 

    static class DefaultBean 
      implements ModifiableBean { 

     @Override 
     public ModifiableData getMyData() 
     { 
      return this.data; 
     } 


     @Override 
     public void setMyData(
       final ModifiableData data) 
     { 
      this.data = data; 
     } 


     private ModifiableData data; 

    } 

} 

Répondre