I wrote a little benchmark that tests performance of java.lang.invoke.MethodHandle, java.lang.reflect.Method and direct calls of methods. 
I read that MethodHandle.invoke() performance almost the same as direct calls. But my test results show another: MethodHandle invoke about three times slower than reflection. What is my problem? May be this is result of some JIT optimisations? 
public class Main {
    public static final int COUNT = 100000000;
    static TestInstance test = new TestInstance();
    static void testInvokeDynamic() throws NoSuchMethodException, IllegalAccessException {
        int [] ar = new int[COUNT];
        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodType mt = MethodType.methodType(int.class);
        MethodHandle handle = lookup.findStatic(TestInstance.class, "publicStaticMethod", mt) ;
        try {
            long start = System.currentTimeMillis();
            for (int i=0; i<COUNT; i++) {
                ar[i] = (int)handle.invokeExact();
            }
            long stop = System.currentTimeMillis();
            System.out.println(ar);
            System.out.println("InvokeDynamic time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
    static void testDirect() {
        int [] ar = new int[COUNT];
        try {
            long start = System.currentTimeMillis();
            for (int i=0; i<COUNT; i++) {
                ar[i] = TestInstance.publicStaticMethod();
            }
            long stop = System.currentTimeMillis();
            System.out.println(ar);
            System.out.println("Direct call time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
    static void testReflection() throws NoSuchMethodException {
        int [] ar = new int[COUNT];
        Method method = test.getClass().getMethod("publicStaticMethod");
        try {
            long start = System.currentTimeMillis();
            for (int i=0; i<COUNT; i++) {
                ar[i] = (int)method.invoke(test);
            }
            long stop = System.currentTimeMillis();
            System.out.println(ar);
            System.out.println("Reflection time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
    static void testReflectionAccessible() throws NoSuchMethodException {
        int [] ar = new int[COUNT];
        Method method = test.getClass().getMethod("publicStaticMethod");
        method.setAccessible(true);
        try {
            long start = System.currentTimeMillis();
            for (int i=0; i<COUNT; i++) {
                ar[i] = (int)method.invoke(test);
            }
            long stop = System.currentTimeMillis();
            System.out.println(ar);
            System.out.println("Reflection accessible time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
    public static void main(String ... args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InterruptedException {
        Thread.sleep(5000);
        Main.testDirect();
        Main.testInvokeDynamic();
        Main.testReflection();
        Main.testReflectionAccessible();
        System.out.println("\n___\n");
        System.gc();
        System.gc();
        Main.testDirect();
        Main.testInvokeDynamic();
        Main.testReflection();
        Main.testReflectionAccessible();
    }
}
Environment: java version "1.7.0_11" Java(TM) SE Runtime Environment (build 1.7.0_11-b21) Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode) OS - Windows 7 64
 
     
     
     
     
     
    