Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8027648

Type of overridden property is resolved incorrectly

    XMLWordPrintable

Details

    • b06
    • b117

    Backports

      Description

        FULL PRODUCT VERSION :
        java version "1.7.0_45"
        Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
        Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)


        A DESCRIPTION OF THE PROBLEM :
        Introspector behavior has changed in 7u40 compared to 7u25 - if return type of getter method can be casted to the return type of getter with same name defined in super-class, then Introspector uses return type of getter in parent class to determine property type.
        As result, even if child bean class has a complete pair of getter and setter methods for property which type is descendant of another property defined in parent bean class, then such property is not recognized by Introspector - it uses type defined in super-class and doesn't link write method for property from child-class.

        REGRESSION. Last worked in version 7u25

        ADDITIONAL REGRESSION INFORMATION:
        java version "1.7.0_25"
        Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
        Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)


        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        1. Create two classes - A and B, where B extends A.
        2. Create a base bean class - BeanA, with getter and setter pair for property 'data' of type A:
        public void setData(A value)
        public A getData()
        3. Create a child bean class - BeanB (BeanB extends BeanA) with getter and setter pair for property 'data' of type B:
        public void setData(B value)
        public B getData()
        4. Run Introspector on BeanB and get type for property 'data' and its read and write methods.

        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        Property type: B
        Read method: BeanB.getData()
        Write method: BeanB.setData()
        ACTUAL -
        Property type: A
        Read method: BeanB.getData()
        Write method: BeanA.setData()

        REPRODUCIBILITY :
        This bug can be reproduced always.

        ---------- BEGIN SOURCE ----------
        A.java:
        public class A {}

        B.java:
        public class B extends A {}

        BeanA.java:
        public class BeanA
        {
          public void setData(A value) {}
          public A getData() {return null;}
        }

        BeanB.java:
        public class BeanB extends BeanA
        {
          public void setData(B value) {}
          public B getData() {return null;}
        }

        Test.java:
        import java.beans.*;
        public class Test
        {
          public static void main(String[] args)
          {
            try
            {
              for(PropertyDescriptor pd : Introspector.getBeanInfo(BeanB.class).getPropertyDescriptors())
              {
                if ("data".equals(pd.getName()))
                {
                  System.out.println("Type: "+pd.getPropertyType().getName());
                  System.out.println("Read: "+pd.getReadMethod());
                  System.out.println("Write: "+pd.getWriteMethod());
                }
              }
            } catch (Throwable t)
            {
              t.printStackTrace();
            }
          }
        }
        ---------- END SOURCE ----------

        CUSTOMER SUBMITTED WORKAROUND :
        One can create custom BeanInfo class for BeanB to describe bean properties with correct type and links to correct getter and setter methods

        Attachments

          Issue Links

            Activity

              People

                malenkov Sergey Malenkov (Inactive)
                malenkov Sergey Malenkov (Inactive)
                Votes:
                0 Vote for this issue
                Watchers:
                4 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved: