getDeclaredMethods() behaving differently in Java 7 vs. Java 8
getDeclaredMethods()
behaves correctly here as it tells you exactly what it has found in the class. If you feed in an interface
compiled with Java 7 target (or an older compiler) you will see no difference to the output of the Java 7 implementation of getDeclaredMethods()
.
It’s the compiler which behaves differently. When compiling such a sub-interface
in Java 8, a bridge method will be generated which will not be generated for a Java 7 target as it is not even possible for the Java 7 target.
The reason why bridge methods are generated for interfaces now is that you usually have more implementation classes than interfaces, therefore having a default
bridge method in the interface saves you from adding that bridge method to every implementation. Further, it makes lambda class generation much easier if there is only one abstract
method and no bridge method to implement.
When an interface
hierarchy requires bridge methods but provides no default
s, the compiler has to generate code using LambdaMetafactory.altMetafactory
rather than LambdaMetafactory.metafactory
specifying every bridge method that is required.