This strange behavior allows you to call methods with the wrong type
For example:
static void test(Integer v) { System.out.println("test " + (Object)v);}MethodHandle test = MethodHandles.lookup().findStatic(/*this class*/, "test", MethodType.methodType(void.class, Integer.class));MethodHandle i1 = MethodHandles.invoker(MethodType.methodType(void.class, Integer.class));MethodHandle i2 = MethodHandles.invoker(MethodType.methodType(void.class, MethodHandle.class, String.class));i2.invoke(i1, test, "string");
prints "test string"
All versions of android 8.0+ behave like this.I was expecting an error while checking the call type.
PS. After some experiments, I did this:
MethodHandle test = MethodHandles.identity(String.class);MethodHandle i1 = MethodHandles.invoker(MethodType.methodType(String.class, String.class));MethodHandle i2 = MethodHandles.invoker(MethodType.methodType(Integer.class, MethodHandle.class, String.class));Integer tmp = (Integer) i2.invokeExact(i1, test, "string");System.out.println(tmp);
prints "string"
WTF?