FULL PRODUCT VERSION :
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b129)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b69, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
When ObjectReference.invokeMethod() is called with a default method that resolves to an interface implementation as the Method parameter, a ClassCastException is thrown. If the default method resolves to an overriding implementation in a concrete class, everything works as expected.
From 8031195 I see that InterfaceType.invokeMethod() will not be added soon, but the call should still succeed on an appropriate ObjectReference.
At the very least, IllegalArgumentException should be thrown instead, for compatibility with existing tools.
Also, in the future, INVOKE_NONVIRTUAL should be supported for ObjectReference.invokeMethod() when called with a default method.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
compile source code
run: jdb InvokeMethodBug
do: stop at InvokeMethodBug:6
run
eval p.negate();
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Successful evaluation.
ACTUAL -
jdb reports a ClassCastException
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Here is a stack dump from a similar procedure using the jGRASP debugger:
-------------------------------------------------------------------------------------------------
java.lang.ClassCastException: com.sun.tools.jdi.InterfaceTypeImpl cannot be cast to com.sun.tools.jdi.ClassTypeImpl
at com.sun.tools.jdi.ObjectReferenceImpl.validateMethodInvocation(ObjectReferenceImpl.java:328)
at com.sun.tools.jdi.ObjectReferenceImpl.invokeMethod(ObjectReferenceImpl.java:381)
at grasp.debugger.JdiDebug.handleInvokeMethod(JdiDebug.java:10895)
...
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.util.function.Predicate;
public class InvokeMethodBug {
public static void main(String[] args) {
Predicate p = (n)->true;
p.negate();
}
}
---------- END SOURCE ----------
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b129)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b69, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
When ObjectReference.invokeMethod() is called with a default method that resolves to an interface implementation as the Method parameter, a ClassCastException is thrown. If the default method resolves to an overriding implementation in a concrete class, everything works as expected.
From 8031195 I see that InterfaceType.invokeMethod() will not be added soon, but the call should still succeed on an appropriate ObjectReference.
At the very least, IllegalArgumentException should be thrown instead, for compatibility with existing tools.
Also, in the future, INVOKE_NONVIRTUAL should be supported for ObjectReference.invokeMethod() when called with a default method.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
compile source code
run: jdb InvokeMethodBug
do: stop at InvokeMethodBug:6
run
eval p.negate();
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Successful evaluation.
ACTUAL -
jdb reports a ClassCastException
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Here is a stack dump from a similar procedure using the jGRASP debugger:
-------------------------------------------------------------------------------------------------
java.lang.ClassCastException: com.sun.tools.jdi.InterfaceTypeImpl cannot be cast to com.sun.tools.jdi.ClassTypeImpl
at com.sun.tools.jdi.ObjectReferenceImpl.validateMethodInvocation(ObjectReferenceImpl.java:328)
at com.sun.tools.jdi.ObjectReferenceImpl.invokeMethod(ObjectReferenceImpl.java:381)
at grasp.debugger.JdiDebug.handleInvokeMethod(JdiDebug.java:10895)
...
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.util.function.Predicate;
public class InvokeMethodBug {
public static void main(String[] args) {
Predicate p = (n)->true;
p.negate();
}
}
---------- END SOURCE ----------
- duplicates
-
JDK-8042123 Support default and static interface methods in JDI, JDWP and JDB
- Resolved
- relates to
-
JDK-8031195 Support default and static interface methods in JDI, JDWP and JDB
- Resolved
-
JDK-8042121 Support default and static interface methods in JDI, JDWP and JDB
- Closed
-
JDK-8042123 Support default and static interface methods in JDI, JDWP and JDB
- Resolved