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;} }