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

Introspector shows wrong method list after 8071693

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: P4 P4
    • tbd
    • 21, 23, 24
    • client-libs
    • None

      After JDK-8071693 Introspector shows default methods, but the list of overriden methods is wrong.

      ```
          public interface A {
              default Object getDefault0() {
                  return null;
              }
              default Object getDefault1() {
                  return null;
              }
              default Object getDefault2() {
                  return null;
              }
              default Object getDefault3() {
                  return null;
              }
              Object getNonDefault();
          }

          public class B implements A {
              @Override
              public Object getDefault1() {
                  return null;
              }
              @Override
              public String getDefault2() {
                  return null;
              }
              @Override
              public Float getDefault3() {
                  return null;
              }
              @Override
              public Long getNonDefault() {
                  return null;
              }
          }
      ```
      For the class above Introspector shows:
      ```
      java.beans.BeanDescriptor[name=After8071693$B; beanClass=class After8071693$B]
      --- properties
      public default java.lang.Object After8071693$A.getDefault0()
      public default java.lang.Object After8071693$A.getDefault1()
      public java.lang.String After8071693$B.getDefault2()
      public java.lang.Float After8071693$B.getDefault3()
      public java.lang.Long After8071693$B.getNonDefault()
      --- methods
      public java.lang.Long After8071693$B.getNonDefault()
      public default java.lang.Object After8071693$A.getDefault0()
      public java.lang.String After8071693$B.getDefault2()
      public default java.lang.Object After8071693$A.getDefault1()
      public default java.lang.Object After8071693$A.getDefault3()
      ```
      See the attached reproducer.

      The methods "getDefault1", "getDefault2", "getDefault3" are overriden, so they should be in the list rather than "default" methods. The reason is "Introspector" doesn't take into account overriden methods while creating a method list.

      I think the correct result should be:

      ```
      java.beans.BeanDescriptor[name=After8071693$B; beanClass=class After8071693$B]
      --- properties
      public default java.lang.Object After8071693$A.getDefault0()
      public java.lang.Object After8071693$B.getDefault1()
      public java.lang.String After8071693$B.getDefault2()
      public java.lang.Float After8071693$B.getDefault3()
      public java.lang.Long After8071693$B.getNonDefault()
      --- methods
      public java.lang.Long After8071693$B.getNonDefault()
      public default java.lang.Object After8071693$A.getDefault0()
      public java.lang.String After8071693$B.getDefault2()
      public java.lang.Object After8071693$B.getDefault1()
      public java.lang.Float After8071693$B.getDefault3()
      ```

      Also note that "getDefault2" and "getDefault3" are similar, except result type, but through method descriptors now we've got:

      ```
      public java.lang.String After8071693$B.getDefault2()
      public default java.lang.Object After8071693$A.getDefault3()
      ```
      The reason here seems to be "MethodOrder" class which sorts metods by a result type's name, so one method is replaced with the default method in the list, and another method is not.

            azvegint Alexander Zvegintsev
            rmarchenko Roman Marchenko
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated: