import java.lang.invoke.*; class Main { void foo() throws Exception { MethodHandles.Lookup l = MethodHandles.lookup(); Class c = Test.class; l.findConstructor(Test.class, MethodType.methodType(void.class)); l.findConstructor(Test.class, MethodType.methodType(void.class, int.class)); l.findConstructor(Test.class, MethodType.methodType(void.class, int.class, String.class)); l.findConstructor(Test.class, MethodType.methodType(void.class, int.class, String[].class)); l.findConstructor(Test.class, MethodType.methodType(void.class, String[][].class)); l.findConstructor((c), MethodType.methodType(void.class)); l.findConstructor(Test.class, MethodType.methodType(int.class)); l.findConstructor(Test.class, MethodType.methodType(Test.class)); l.findConstructor(Test.class, MethodType.methodType(Test.class, int.class)); l.findConstructor(Test.class, MethodType.methodType(void.class, String.class)); l.findConstructor(Test.class, MethodType.methodType(void.class, int.class, String[][].class)); l.findConstructor(Test.class, MethodType.methodType(void.class, String[].class)); l.findConstructor(WithDefault.class, MethodType.methodType(void.class)); l.findConstructor(Class.forName("WithDefault"), MethodType.methodType(void.class)); l.findConstructor(NoDefault.class, MethodType.methodType(void.class)); l.findConstructor(Class.forName("NoDefault"), MethodType.methodType(void.class)); } } class Test { public Test() {} public Test(int a) {} public Test(int a, String b) {} public Test(int a, String... b) {} public Test(String[]... b) {} } class WithDefault { } class NoDefault { public NoDefault(int n) {} }