import java.lang.invoke.*;
import java.util.Arrays;
import java.util.List;
class Main {
void foo() throws Exception {
MethodHandles.Lookup l = MethodHandles.lookup();
l.findStatic(Test.class, "method1", MethodType.methodType(void.class));
l.findStatic(Test.class, "method1", MethodType.methodType(Void.TYPE));
l.findStatic(Test.class, "method2", MethodType.methodType(String.class, String.class));
l.findStatic(Test.class, "method3", MethodType.methodType(String.class, String.class, String[].class));
l.findStatic(Test.class, "method1", MethodType.methodType(Test.class));
l.findStatic(Test.class, "method2", MethodType.methodType(int.class, String.class));
l.findStatic(Test.class, "method3", MethodType.methodType(String.class));
l.findVirtual(Test.class, "method1", MethodType.methodType(void.class));
l.findStatic(Test.class, "doesntExist", MethodType.methodType(String.class));
}
void differentMethodTypeOverloads() throws Exception {
MethodHandles.Lookup l = MethodHandles.lookup();
l.findStatic(Test.class, "method2", MethodType.methodType(int.class, String.class));
l.findStatic(Test.class, "method2", MethodType.methodType(int.class, List.of(String.class)));
l.findStatic(Test.class, "method2", MethodType.methodType(int.class, Arrays.asList(String.class)));
l.findStatic(Test.class, "method2", MethodType.methodType(int.class, new Class>[]{String.class}));
l.findStatic(Test.class, "method2", MethodType.methodType(int.class, MethodType.methodType(void.class, List.of(String.class))));
}
}
class Test {
public static void method1() {}
public static String method2(String a) {return a;}
public static String method3(String a, String... b) {return a;}
}