package com.ankurm.reflection;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Method;

/**
 * The smallest useful tour: one class, called by reflection and by a MethodHandle.
 * Self-contained - run it with:  java QuickStart.java
 */
public class QuickStart {

    public static class Greeter {
        public String greet(String name) {
            return "Hello, " + name;
        }
    }

    public static void main(String[] args) throws Throwable {
        Greeter g = new Greeter();

        Method m = Greeter.class.getMethod("greet", String.class);
        System.out.println("reflection   : " + m.invoke(g, "Ankur"));

        MethodHandle h = MethodHandles.lookup().findVirtual(Greeter.class, "greet",
                MethodType.methodType(String.class, String.class));
        String s = (String) h.invokeExact(g, "Ankur");
        System.out.println("MethodHandle : " + s);
    }
}
