-
Bug
-
Resolution: Unresolved
-
P4
-
21, 23, 24
-
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.
```
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.
- caused by
-
JDK-8071693 Introspector ignores default interface methods
-
- Resolved
-
- links to
-
Review(master) openjdk/jdk/23443