-
Bug
-
Resolution: Not an Issue
-
P4
-
None
-
18
-
generic
-
generic
A DESCRIPTION OF THE PROBLEM :
Starting with jdk 18-ea, a ClassCastException is thrown on MethodHandle::invoke.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the attached test case.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
JRE 11.0.6+10-LTS
callsite
JRE 16.0.2+7
callsite
JRE 17+35-LTS
callsite
ACTUAL -
JRE 18-ea+24-1608
Exception in thread "main" java.lang.ClassCastException: Cannot cast [Ljava.lang.Object; to Invoke$MyParam
at java.base/java.lang.Class.cast(Class.java:3921)
at Invoke.<init>(Invoke.java:20)
at Invoke.main(Invoke.java:11)
---------- BEGIN SOURCE ----------
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodHandles.Lookup;
public class Invoke {
private static final Lookup lookup = MethodHandles.lookup();
private final MethodHandle mh;
public static void main(final String[] args) throws Throwable {
System.out.println("JRE " + Runtime.version());
new Invoke();
}
public Invoke() throws Throwable {
final var targetClass = this;
final var method = targetClass.getClass().getDeclaredMethod("callsite", MyParam.class);
final var privateLookup = MethodHandles.privateLookupIn(targetClass.getClass(), lookup);
mh = privateLookup.unreflect(method).bindTo(targetClass);
mh.invoke(new MyParam());
}
static class MyParam {}
void callsite(final MyParam event) { System.out.println("callsite"); }
}
---------- END SOURCE ----------
FREQUENCY : always
Starting with jdk 18-ea, a ClassCastException is thrown on MethodHandle::invoke.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the attached test case.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
JRE 11.0.6+10-LTS
callsite
JRE 16.0.2+7
callsite
JRE 17+35-LTS
callsite
ACTUAL -
JRE 18-ea+24-1608
Exception in thread "main" java.lang.ClassCastException: Cannot cast [Ljava.lang.Object; to Invoke$MyParam
at java.base/java.lang.Class.cast(Class.java:3921)
at Invoke.<init>(Invoke.java:20)
at Invoke.main(Invoke.java:11)
---------- BEGIN SOURCE ----------
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodHandles.Lookup;
public class Invoke {
private static final Lookup lookup = MethodHandles.lookup();
private final MethodHandle mh;
public static void main(final String[] args) throws Throwable {
System.out.println("JRE " + Runtime.version());
new Invoke();
}
public Invoke() throws Throwable {
final var targetClass = this;
final var method = targetClass.getClass().getDeclaredMethod("callsite", MyParam.class);
final var privateLookup = MethodHandles.privateLookupIn(targetClass.getClass(), lookup);
mh = privateLookup.unreflect(method).bindTo(targetClass);
mh.invoke(new MyParam());
}
static class MyParam {}
void callsite(final MyParam event) { System.out.println("callsite"); }
}
---------- END SOURCE ----------
FREQUENCY : always