-
Bug
-
Resolution: Fixed
-
P3
-
11.0.26-oracle, 17.0.14, 17.0.14-oracle, 21, 23, 24
-
b21
-
b26
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8358779 | 21.0.9 | Roman Marchenko | P3 | Resolved | Fixed | master |
```
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.
- backported by
-
JDK-8358779 Introspector shows wrong method list after 8071693
-
- Resolved
-
- caused by
-
JDK-8071693 Introspector ignores default interface methods
-
- Resolved
-
- relates to
-
JDK-8352479 BeanInfo(class).getPropertyDescriptors() includes default methods in 11.0.26
-
- Resolved
-
- links to
-
Commit(master) openjdk/jdk21u-dev/edd41203
-
Commit(master) openjdk/jdk/c5f235c0
-
Review(master) openjdk/jdk17u-dev/3618
-
Review(master) openjdk/jdk21u-dev/1847
-
Review(master) openjdk/jdk/23443